这个 haskell 函数中的这些值从哪里来?
假设我有以下函数:
sumAll :: [(Int,Int)] -> Int
sumAll xs = foldr (+) 0 (map f xs)
where f (x,y) = x+y
sumAll [(1,1),(2,2),(3,3)]
的结果将为 12
。
我不明白的是 (x,y)
值来自哪里。 好吧,我知道它们来自 xs
变量,但我不明白如何实现。 我的意思是,直接执行上面的代码而不使用 where 关键字,它会是这样的:
sumAll xs = foldr (+) 0 (map (\(x,y) -> x+y) xs)
而且我无法理解,在顶部代码中, f
变量和 (x ,y)
变量表示 (\(x,y) -> x+y)
lambda 表达式。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
希望这会有所帮助。 关键是
f
应用于列表中的元素,这些元素是成对的。Hopefully this will help. The key is that
f
is applied to the elements of the list, which are pairs.在 Haskell 中,函数是第一类数据类型。
这意味着您可以像传递其他类型的数据(例如整数和字符串)一样传递函数。
在上面的代码中,您将“f”声明为一个函数,它接受一个参数 a(两个值 (x,y) 的元组)并返回 (x + y) 的结果。
foldr 是另一个函数,它接受 3 个参数、一个二元函数(在本例中为 +)、一个起始值 (0) 和一个要迭代的值数组。
简而言之,“where f (x,y) = x + y”只是
Edit 的作用域简写:如果您不确定foldr 的工作原理,请查看 Haskell 参考 Zvon
下面是foldl/map 的示例实现。
In Haskell, functions are first class datatypes.
This means you can pass functions around like other types of data such as integers and strings.
In your code above you declare 'f' to be a function, which takes in one argumenta (a tuple of two values (x,y)) and returns the result of (x + y).
foldr is another function which takes in 3 arguments, a binary function (in this case +) a starting value (0) and an array of values to iterator over.
In short 'where f (x,y) = x + y' is just scoped shorthand for
Edit: If your unsure about how foldr works, check out Haskell Reference Zvon
Below is an example implementation of foldl / map.
不是答案,但我想我应该指出你的函数 f:
可以表示为
Not an answer, but I thought I should point out that your function f:
can be expressed as