data N = Z | S (n:: N) zero :: N = Z one :: N = S zero two :: N = S one three:: N = S two data NatList = nil | cons (n:: N) (l:: NatList) map (f :: N -> N) (l:: NatList) :: NatList = case l of (nil )-> nil (cons n l')-> cons (f n) (map f l') test :: NatList = map (\(n::N)-> S n) (cons two (cons three nil)) showTest :: NatList = {!test !}