module Data.List /* This is a comment */ export datatype List a = NULL() | (:)(a,List a); export (++)(a :: [a], b :: [a]) :: [a] { case a { [] -> b; (af:ar) -> case b { [] -> a; _ -> af:(ar ++ b); } } }; export null(ls :: [a]) :: Bool { case ls { [] -> True; _ -> False; } }; export length(ls :: [a]) :: Int { case ls { [] -> 0; (_:rest) -> 1 + length(rest); } }; export reverse(ls :: [a]) :: [a] { let helper(xs,acc) = { case xs { [] -> acc; (a:rest) -> helper(rest, (a:acc)); } }; helper(ls, []); }; export restrict(Eq a) find(f :: a -> Bool, ls :: [a]) :: Maybe a { case ls { [] -> False; (a:_) | f(a) -> a; (_:rest) -> find(f, rest); } };