[haskell] redoing Hlist.hs
This commit is contained in:
parent
bd923a9976
commit
7ade069098
|
@ -0,0 +1 @@
|
||||||
|
Template metaprogramming in C++
|
|
@ -0,0 +1,46 @@
|
||||||
|
#include<iostream>
|
||||||
|
#include<list>
|
||||||
|
|
||||||
|
template<unsigned n>
|
||||||
|
struct factorial {
|
||||||
|
enum { val = n * factorial<n-1>::val };
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct factorial<0> {
|
||||||
|
enum { val = 1 };
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
std::cout << factorial<0>::val << std::endl;
|
||||||
|
std::cout << factorial<1>::val << std::endl;
|
||||||
|
std::cout << factorial<2>::val << std::endl;
|
||||||
|
std::cout << factorial<3>::val << std::endl;
|
||||||
|
std::cout << factorial<4>::val << std::endl;
|
||||||
|
std::cout << factorial<5>::val << std::endl;
|
||||||
|
std::cout << factorial<6>::val << std::endl;
|
||||||
|
std::cout << factorial<7>::val << std::endl;
|
||||||
|
std::cout << factorial<8>::val << std::endl;
|
||||||
|
std::cout << factorial<9>::val << std::endl;
|
||||||
|
std::cout << factorial<10>::val << std::endl;
|
||||||
|
std::cout << factorial<11>::val << std::endl;
|
||||||
|
std::cout << factorial<12>::val << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output
|
||||||
|
/*
|
||||||
|
1
|
||||||
|
1
|
||||||
|
2
|
||||||
|
6
|
||||||
|
24
|
||||||
|
120
|
||||||
|
720
|
||||||
|
5040
|
||||||
|
40320
|
||||||
|
362880
|
||||||
|
3628800
|
||||||
|
39916800
|
||||||
|
479001600
|
||||||
|
*/
|
|
@ -0,0 +1,57 @@
|
||||||
|
{-# LANGUAGE DataKinds #-}
|
||||||
|
{-# LANGUAGE GADTs #-}
|
||||||
|
{-# LANGUAGE TypeOperators #-}
|
||||||
|
{-# LANGUAGE TypeFamilies #-}
|
||||||
|
|
||||||
|
|
||||||
|
-- -- Method 1
|
||||||
|
-- data family Hlist (l :: [*])
|
||||||
|
-- data instance Hlist '[] = HNil
|
||||||
|
-- data instance Hlist (t ': ts) = HCons t (Hlist ts)
|
||||||
|
|
||||||
|
-- hd :: Hlist (t ': ts) -> t
|
||||||
|
-- hd (HCons x _) = x
|
||||||
|
|
||||||
|
-- tl :: Hlist (t ': ts) -> Hlist ts
|
||||||
|
-- tl (HCons _ xs) = xs
|
||||||
|
|
||||||
|
-- idx :: Hlist ts -> (n :: Int) -> (ts '!! n)
|
||||||
|
|
||||||
|
-- -- Can't make it work
|
||||||
|
-- -- app :: Hlist ts1 -> Hlist ts2 -> Hlist (ts1 '++ ts2)
|
||||||
|
-- -- app HNil hls2 = hls2
|
||||||
|
|
||||||
|
-- -- Can't make it work
|
||||||
|
-- -- len :: Hlist ts -> Int
|
||||||
|
-- -- len HNil = 0
|
||||||
|
-- -- len (HCons _ xs) = 1 + (len xs)
|
||||||
|
|
||||||
|
|
||||||
|
-- -- Method 2 ??
|
||||||
|
-- data HNil = HNil
|
||||||
|
-- data HCons a b = HCons a b
|
||||||
|
|
||||||
|
-- a = HCons 3 HNil
|
||||||
|
-- b = HCons 3 (HCons True HNil)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- -- Method 3
|
||||||
|
-- data Hlist :: [*] -> * where
|
||||||
|
-- HNil :: Hlist '[]
|
||||||
|
-- HCons :: t -> Hlist ts -> Hlist (t : ts)
|
||||||
|
|
||||||
|
-- data Member x (l':ls) where
|
||||||
|
-- First :: Member x (l:ls)
|
||||||
|
-- Next :: Member x ls -> Member x (l:ls)
|
||||||
|
|
||||||
|
-- data Member x (l':ls) where
|
||||||
|
-- First :: Member x (l:ls)
|
||||||
|
-- Next :: Member x ls -> Member x (l:ls)
|
||||||
|
|
||||||
|
-- len :: Hlist ts -> Int
|
||||||
|
-- len HNil = 0
|
||||||
|
-- len (HCons _ xs) = 1 + (len xs)
|
||||||
|
|
||||||
|
-- a = HCons 3 HNil
|
||||||
|
-- b = HCons 3 (HCons True HNil)
|
|
@ -1,57 +1,58 @@
|
||||||
{-# LANGUAGE DataKinds #-}
|
{-# LANGUAGE DataKinds #-}
|
||||||
{-# LANGUAGE GADTs #-}
|
{-# LANGUAGE GADTs #-} -- Enabled by default apparently
|
||||||
{-# LANGUAGE TypeOperators #-}
|
{-# LANGUAGE TypeOperators #-} -- Enabled by default apparently
|
||||||
{-# LANGUAGE TypeFamilies #-}
|
{-# LANGUAGE TypeFamilies #-}
|
||||||
|
|
||||||
|
|
||||||
-- -- Method 1
|
|
||||||
-- data family Hlist (l :: [*])
|
|
||||||
-- data instance Hlist '[] = HNil
|
|
||||||
-- data instance Hlist (t ': ts) = HCons t (Hlist ts)
|
|
||||||
|
|
||||||
-- hd :: Hlist (t ': ts) -> t
|
|
||||||
-- hd (HCons x _) = x
|
|
||||||
|
|
||||||
-- tl :: Hlist (t ': ts) -> Hlist ts
|
|
||||||
-- tl (HCons _ xs) = xs
|
|
||||||
|
|
||||||
-- idx :: Hlist ts -> (n :: Int) -> (ts '!! n)
|
|
||||||
|
|
||||||
-- -- Can't make it work
|
|
||||||
-- -- app :: Hlist ts1 -> Hlist ts2 -> Hlist (ts1 '++ ts2)
|
|
||||||
-- -- app HNil hls2 = hls2
|
|
||||||
|
|
||||||
-- -- Can't make it work
|
|
||||||
-- -- len :: Hlist ts -> Int
|
|
||||||
-- -- len HNil = 0
|
|
||||||
-- -- len (HCons _ xs) = 1 + (len xs)
|
|
||||||
|
|
||||||
|
|
||||||
-- -- Method 2 ??
|
|
||||||
-- data HNil = HNil
|
|
||||||
-- data HCons a b = HCons a b
|
|
||||||
|
|
||||||
-- a = HCons 3 HNil
|
|
||||||
-- b = HCons 3 (HCons True HNil)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- Method 3
|
|
||||||
data Hlist :: [*] -> * where
|
data Hlist :: [*] -> * where
|
||||||
HNil :: Hlist '[]
|
HNil :: Hlist '[]
|
||||||
HCons :: t -> Hlist ts -> Hlist (t : ts)
|
HCons :: t -> Hlist ts -> Hlist (t : ts)
|
||||||
|
|
||||||
data Member x (l':ls) where
|
data Member :: a -> [*] -> * where
|
||||||
First :: Member x (l:ls)
|
First :: Member x (x':l)
|
||||||
Next :: Member x ls -> Member x (l:ls)
|
Next :: Member x l -> Member x (x':l)
|
||||||
|
|
||||||
-- data Member x (l':ls) where
|
-- data Member x (l':ls) where
|
||||||
-- First :: Member x (l:ls)
|
-- First :: Member x (l:ls)
|
||||||
-- Next :: Member x ls -> Member x (l:ls)
|
-- Next :: Member x ls -> Member x (l:ls)
|
||||||
|
|
||||||
-- len :: Hlist ts -> Int
|
hd :: Hlist (t ': ts) -> t
|
||||||
-- len HNil = 0
|
hd (HCons x _) = x
|
||||||
-- len (HCons _ xs) = 1 + (len xs)
|
|
||||||
|
|
||||||
-- a = HCons 3 HNil
|
tl :: Hlist (t ': ts) -> Hlist ts
|
||||||
-- b = HCons 3 (HCons True HNil)
|
tl (HCons _ xs) = xs
|
||||||
|
|
||||||
|
len :: Hlist ts -> Int
|
||||||
|
len HNil = 0
|
||||||
|
len (HCons _ xs) = 1 + (len xs)
|
||||||
|
|
||||||
|
type family (++) (l1 :: [*]) (l2 :: [*]) where
|
||||||
|
'[] ++ y = y
|
||||||
|
(x':xs) ++ y = x':(xs ++ y)
|
||||||
|
|
||||||
|
cat :: Hlist ts1 -> Hlist ts2 -> Hlist (ts1 ++ ts2)
|
||||||
|
cat HNil y = y
|
||||||
|
cat (HCons x xs) y = HCons x (cat xs y)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- Example hlists
|
||||||
|
a = HCons 3 HNil
|
||||||
|
b = HCons 3 (HCons True HNil)
|
||||||
|
-- λ> a
|
||||||
|
-- a :: Hlist '[Integer]
|
||||||
|
-- λ> b
|
||||||
|
-- b :: Hlist '[Integer, Bool]
|
||||||
|
-- λ> tl a
|
||||||
|
--
|
||||||
|
-- tl a :: Hlist '[]
|
||||||
|
-- λ> tl b
|
||||||
|
-- tl b :: Hlist '[Bool]
|
||||||
|
-- λ> hd a
|
||||||
|
-- 3
|
||||||
|
-- λ> hd (tl b)
|
||||||
|
-- True
|
||||||
|
-- λ> hd $ tl (tl b) -- Error
|
||||||
|
--
|
||||||
|
-- λ> cat b b
|
||||||
|
-- cat b b :: Hlist '[Integer, Bool, Integer, Bool]
|
||||||
|
|
Loading…
Reference in New Issue