gpt4 book ai didi

haskell - 具有运行时错误的 Foldl 实现

转载 作者:行者123 更新时间:2023-12-02 21:30:02 26 4
gpt4 key购买 nike

Learn You a Haskell解释foldl1:

The foldl1 and foldr1 functions work much like foldl and foldr, only you don't need to provide them with an explicit starting value. They assume the first (or last) element of the list to be the starting value and then start the fold with the element next to it. ...

Because they depend on the lists they fold up having at least one element, they cause runtime errors if called with empty lists

我认为它的实现或多或少如下:

foldl1' :: (a -> a -> a) -> [a] -> a
foldl1' f ys = foldl f (head ys) (tail ys)

但是,这个潜在的运行时错误让我很困扰。

为什么不按以下方式实现foldlOption

foldlOption :: (a -> a -> a) -> [a] -> Maybe a
foldlOption f [] = Nothing
foldlOption f ys = Just (foldl f (head ys) (tail ys))

REPL

*Main> foldlOption (\acc elem -> if (elem > acc) then elem else acc) []
Nothing

-- find max
*Main> foldlOption (\acc elem -> if (elem > acc) then elem else acc) [1,100,2,3]
Just 100

已编辑

更新了 foldl1foldlOption 的定义,以使用 tail ys 作为 foldl 的最后一个参数,而不是 Lee Duhemys的修正。 .

最佳答案

实际上没有充分的理由不这样做。 Haskell Prelude 中的许多函数,例如 headtailinit 以及许多其他函数都不必要地失败。

如果他们能够明确地指出类型中的失败,那就更好了,但不幸的是,当 Prelude 标准化时,情况并非如此,我们无法很好地更改几个核心函数,例如 head !

现在,我建议不要使用其中的许多函数,而选择模式匹配,或 Gabriel Gonzalez 的 errors库,它提供了正确失败的 prelude 部分函数的替代版本。

例如在Control.Error.Safe中有

foldl1Err :: e -> (a -> a -> a) -> [a] -> Either e a

并且错误还导出 safe,一个与 Maybe 类似的库,它具有该功能

foldl1May :: (a -> a -> a) -> [a] -> Maybe a

正是你想要的:)

关于haskell - 具有运行时错误的 Foldl 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23183935/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com