了解一下Haskell解释了foldl1

foldl1和foldr1函数的工作方式与foldl和foldr非常相似,只是您不需要为它们提供明确的起始值。 他们假设列表的第一个(或最后一个)元素是起始值,然后使用旁边的元素开始折叠。 ...

因为它们依赖于它们折叠的列表至少有一个元素,所以如果使用空列表调用它们会导致运行时错误

我认为它的实现或多或少是以下几点:

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

EDITED

更新foldl1的和foldlOption的定义,使用tail ys作为最后一个参数foldl ,不ys李迪昂的修正。

===============>>#1 票数:12 已采纳

实际上没有理由不这样做。 Haskell的前奏中的许多函数如headtailinit和许多其他函数都会不必要地失败。

对于他们明确地记录他们在类型中的失败会更好,但不幸的是,当Prelude被标准化时我们不能很好地改变像head这样的几个核心功能!

现在我建议不要使用许多这些功能并选择模式匹配,或者加布里埃尔·冈萨雷斯的错误库,它提供了前奏部分功能的替代版本,这些功能正常失败。

例如在Control.Error.Safe

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

和错误也导出安全,类似的库与Maybe的s具有该功能

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

完全像你想要的:)

  ask by Kevin Meredith translate from so

未解决问题?本站智能推荐:

1回复

快速检查运行时错误

我对使用快速检查库感兴趣,但似乎它是设计用来测试属性的。 我想做的是为我定义的数据类型和编写的测试函数生成随机数据。 我不在乎结果是什么,即使函数在输入随机数据时产生运行时错误。 我看到的所有快速检查示例都是用于测试函数的属性的,例如在输入随机数据时结果大于5。 有没有办法以这种方式使用
1回复

如何处理Haskell中的运行时错误?

我正在尝试通过编写一个简单的控制台象棋游戏来学习Haskell。 它显示一个棋盘,并从SAN表示法中的标准输入移动。 这是我到目前为止所得到的: 问题是对moveSAN功能的调用有时会使程序崩溃,从而失去游戏中取得的所有进展。 例如,在“您的移动:”提示下按Enter键会产生:
1回复

Haskell可以有哪些运行时错误?

我已经读过Haskell实际上可以有运行时错误,尽管是静态类型和功能。 但是,没有一个人说,这些可能是什么运行时错误。 谁知道?
1回复

Haskell运行时错误:错误:前奏。(!!):索引太大

我在Haskell中的功能很长,有点古怪。 简而言之,此函数检查两个字符串是否相同,如果它们具有一个或多个“ $”,则认为它们相同。 [长版本:为节省您的解密时间,它使用两个字符串,即列表理解中的一个索引变量从0到最长字符串的长度。 然后将当前索引处每个String的元素与彼此或美元符
2回复

运行时错误-功能中的非穷举模式

我想编写一个输出从1到n的数字列表的函数:[1,2,... n],我知道可以用[1..n]完成,但是我想创建自己的函数: 尽管上面的代码可以编译并运行,但是会出现以下运行时错误: 问题在哪里,如何解决?
3回复

为什么Haskell推断返回类型多态性中的类型会导致运行时错误?

我之所以选择使用Haskell是因为它具有丰富的类型系统 。 这在编译时为我提供了有关程序的更多信息,使我对它的健全性充满信心。 另外,似乎Haskell是一种用于处理表达式问题的最佳语言,因为Haskell类型类可以在return type上分派 。 (与Clojure协议相反-只能
1回复

为什么欠约束类型有时会给出运行时错误?

考虑以下: 在GHCI中运行,这给出了 我期望一个“ambigious type variable”编译错误,但是这会在运行时出现。 为什么? 为了比较,以下三个示例确实给出了“模糊类型变量”错误: 顺便说一句,这是我遇到这个的原始代码。 这已经解决了
2回复

抑制运行时错误“模式Data.Maybe.Just b”的Irrefutable模式失败

我有以下功能: 问题是,当PSQ“刚刚”被创建为空PSQ时,Just无法匹配并在运行时给出了无可辩驳的模式错误。 这恰好发生一次,因为显然队列后来被填充并且只是b总是匹配。 我试图测试队列是否为空,然后在我的函数中对它进行操作但这使得整个事情运行速度慢了两倍。 因为这显然没
1回复

带有0MQ Haskell绑定的运行时错误:getIntOpt:已中断(系统调用已中断)

具有以下功能的是基于0MQ Haskell绑定的。 我在运行时出现错误。 该错误显示getIntOpt: interrupted (Interrupted system call) ,程序停止。 它可能必须对我使用的命令行选项进行某些处理,然后由于条件而放弃? 编辑:发现当我用c
1回复

Idris`foldl`默认实现

interface Foldable t where foldr : (func : elem -> acc -> acc) -> (init : acc) -> (input : t elem) -> acc foldl : (func : acc ->