[haskell] redoing Hlist.hs

This commit is contained in:
Julin S 2023-09-30 12:40:17 +05:30
parent bd923a9976
commit 7ade069098
5 changed files with 149 additions and 44 deletions

1
cpp/tmp/README.org Normal file
View File

@ -0,0 +1 @@
Template metaprogramming in C++

46
cpp/tmp/factorial.cpp Normal file
View File

@ -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
*/

57
haskell/Hlist-orig.hs Normal file
View File

@ -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)

View File

@ -1,57 +1,58 @@
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE GADTs #-} -- Enabled by default apparently
{-# LANGUAGE TypeOperators #-} -- Enabled by default apparently
{-# 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 :: a -> [*] -> * where
First :: Member x (x':l)
Next :: Member x l -> Member x (x':l)
-- 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)
hd :: Hlist (t ': ts) -> t
hd (HCons x _) = x
-- a = HCons 3 HNil
-- b = HCons 3 (HCons True HNil)
tl :: Hlist (t ': ts) -> Hlist ts
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]