了解一下Haskell解释说foldl1:
foldl1和foldr1函数的工作方式与foldl和foldr非常相似,只是您不需要为它们提供明确的起始值.他们假设列表的第一个(或最后一个)元素是起始值,然后使用旁边的元素开始折叠....
因为它们依赖于它们折叠的列表至少有一个元素,所以如果使用空列表调用它们会导致运行时错误
我认为它的实现或多或少是以下几点:
foldl1' :: (a -> a -> a) -> [a] -> a
foldl1' f ys = foldl f (head ys) (tail ys)
Run Code Online (Sandbox Code Playgroud)
但是,这种潜在的运行时错误让我很烦恼.
为什么不foldlOption以下列方式实施?
foldlOption :: (a -> a -> a) -> [a] -> Maybe a
foldlOption f [] = Nothing
foldlOption f ys = Just (foldl f (head ys) (tail ys))
Run Code Online (Sandbox Code Playgroud)
REPL
*Main> foldlOption (\acc elem -> if (elem > acc) then elem else acc) []
Nothing
-- find max
*Main> …Run Code Online (Sandbox Code Playgroud) haskell ×1