diff --git a/cpp/tmp/README.org b/cpp/tmp/README.org new file mode 100644 index 0000000..eb5392f --- /dev/null +++ b/cpp/tmp/README.org @@ -0,0 +1 @@ +Template metaprogramming in C++ diff --git a/cpp/tmp/factorial.cpp b/cpp/tmp/factorial.cpp new file mode 100644 index 0000000..7f296d2 --- /dev/null +++ b/cpp/tmp/factorial.cpp @@ -0,0 +1,46 @@ +#include +#include + +template +struct factorial { + enum { val = n * factorial::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 +*/ diff --git a/haskell/Hlist-orig.hs b/haskell/Hlist-orig.hs new file mode 100644 index 0000000..fe1dfc3 --- /dev/null +++ b/haskell/Hlist-orig.hs @@ -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) diff --git a/haskell/Hlist.hs b/haskell/Hlist.hs index e5964af..bb3d6bb 100644 --- a/haskell/Hlist.hs +++ b/haskell/Hlist.hs @@ -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] diff --git a/risc-v/README.md b/risc-v/README.org similarity index 100% rename from risc-v/README.md rename to risc-v/README.org