Haskell is practical for general purpose programming -- non-total like most languages you have probably encountered
Observe that we have tests as documentation -- there is nothing more we can write! These are the unambiguous and only essential elements of the reverse function
f :: [a] -> [a]
f [] = []
forall x. f [x] = [x]
forall x y. f (x ++ y) = f y ++ f x