-- data Bool () where { -- True : Bool () -- False : Bool () -- }; -- -- data List ('a) where { -- Nil : List ('a) -- Cons : ('a) -> List ('a) -> List ('a) -- }; data Maybe ('a) where { Nothing : Maybe ('a) Just : 'a -> Maybe ('a) }; id : 'a -> 'a ; id x = x ; main : Maybe ('a -> 'a) ; main = Just id; -- data Either ('a 'b) where { -- Left : 'a -> Either ('a 'b) -- Right : 'b -> Either ('a 'b) -- }; -- safeHead : List ('a) -> Maybe ('a) ; -- safeHead xs = -- case xs of { -- Nil => Nothing ; -- Cons x xs => Just x -- }; -- main : Maybe (_Int) ; -- main = safeHead (Cons 0 (Cons 1 Nil)) ; -- -- maybeToEither : Either ('a 'b) -> Maybe ('a) ; -- maybeToEither e = -- case e of { -- Left y => Nothing ; -- Right x => Just x -- }; -- -- -- Bug. f not included in the case-expression context -- fmap : ('a -> 'b) -> Maybe ('a) -> Maybe ('b) ; -- fmap f x = -- case x of { -- Just x => Just (f x) ; -- Nothing => Nothing -- }