相关疑难解决方法(0)

foldl实现运行时错误

了解一下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

6
推荐指数
1
解决办法
708
查看次数

标签 统计

haskell ×1