gpt4 book ai didi

haskell - 使用 lambda 作为 "foldr"的运算符

转载 作者:行者123 更新时间:2023-12-04 12:30:10 25 4
gpt4 key购买 nike

所以我正在学习 Haskell 类(class),并遇到了使用foldr函数定义长度函数

因此,由于长度不是原始递归函数,因此我们必须更具体地说明传递给它的“运算符”,当然,最终结果是这样的:

len :: [a] -> Int
len = foldr (\_ n -> n + 1) 0

我想我理解了最终结果,但我确实需要澄清 lambda 函数的签名:

  • 下划线参数应该是我们不关心的值
  • 第 n 个参数是前一个调用的返回结果

我这样想对吗?或者发生了不同的事情?

最佳答案

你的假设是正确的:

  • 我们不关心列表的元素,因此我们可以忽略它们并使用下划线来明确这一点。
  • n 确实是该函数上次调用的返回值。也可以将其命名为acc,代表累加器,这使得其含义更加清晰。

准确地说,正如 Carl 指出的,在 foldr 的情况下,n 是对列表元素的函数的嵌套调用,如果评估,则进行递归评估。因此,n 成为递归调用 foldr 的结果。

出于可视化目的:

-- how `foldr (+) 0 [1..5]` unfolds
λ> foldr (\x y -> "( " ++ x ++ " + " ++ y ++ " )") "0" $ map show [1..5]
"( 1 + ( 2 + ( 3 + ( 4 + ( 5 + 0 ) ) ) ) )"
-- how `foldl (+) 0 [1..5]` unfolds
λ> foldl (\x y -> "( " ++ x ++ " + " ++ y ++ " )") "0" $ map show [1..5]
"( ( ( ( ( 0 + 1 ) + 2 ) + 3 ) + 4 ) + 5 )"

关于haskell - 使用 lambda 作为 "foldr"的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69739666/

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