data List a = Nil | Cons a (() -> List a)

instance Show a => Show (List a) where
  show Nil = "Nil"
  show (Cons x xs) = "(Cons " ++ show x ++ " " ++ show (xs ()) ++ ")"

headL :: List a -> a
headL (Cons x _) = x

tailL :: List a -> List a
tailL (Cons _ xs) = xs ()

nullL :: List a -> Bool
nullL Nil = True
nullL (Cons _ _) = False

fromL :: Int -> List Int
fromL n = Cons n (\_ -> fromL (n+1))

takeL :: Int -> List a -> List a
takeL 0 _  = Nil
takeL n xs = if nullL xs then Nil
              else Cons (headL xs) (\_ -> takeL (n-1) (tailL xs))


