data List a = Nil | Cons a (List a) @private @inline build :: (forall a. a -> (b -> a -> a) -> a) -> List b build f = f Nil Cons @private foldr :: (a -> b -> b) -> b -> List a -> b foldr cons nil Nil = nil foldr cons nil (Cons h t) = cons h (foldr cons nil t) @private @inline singleton :: a -> List a singleton x = build (\nil cons -> cons x nil) @private @inline last :: List a -> a -> a last l def = foldr (\x _ -> x) def l main = last (singleton "Hello") "Foo" -- Hello