Первое, что приходит на ум, - это использовать foldl1
вместо foldl
, затем:
head'' :: [a] -> a
head'' = foldl1 (\x _ -> x)
и, поскольку foldl1
определяется в терминах foldl
, если списокнепусто (и вылетает, если список пуст - но так же head
):
foldl1 f (x:xs) = foldl f x xs
мы можем сказать
head'' (x:xs) = foldl (\x _ -> x) x xs
То же самое, конечно, для last
,используя foldr1