gpt4 book ai didi

haskell - 对 Haskell lambdas 中的参数感到困惑

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

我最近一直在学习 Haskell,遇到了一些我不太了解的东西:lambda 函数的参数。
在 Learn You a Haskell for Great Good 一书中,第。 5、有以下两个功能:

elem' :: (Eq a) => a -> [a] -> Bool
elem' y ys = foldr (\x acc -> if x == y then True else acc) False ys
reverse' :: [a] -> [a]
reverse' = foldl (\acc x -> x : acc) []
在第一个函数中,累加器被列为 lambda 的第二个参数,但随后是第一个跟随 lambda 的 foldl ,我认为这将是第一个,而不是第二个,因此,无视预期。
而在第二个函数中,它遵循预期,显示为 lambda 的第一个参数,使列表 reverse'将 lambda 的第二个作为参数。
我测试了这两个功能,它们按预期工作。我还注意到一个函数涉及右折叠,另一个涉及左折叠,但我不确定为什么这会改变参数的含义。
问题:有人可以解释我缺少什么吗?为什么参数似乎交换了位置?

最佳答案

foldlfoldr期望累加函数具有不同的格式。这两个函数有以下类型:

foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
您在 foldr 中是正确的,累加器是第二个参数,在 foldl这是左边。

虽然这可能看起来不直观,但考虑 foldl 可能会有所帮助。和 foldr就它们如何关联列表中的值而言,以下图片来自 "fold" page on the Haskell wiki :


将列表的自然顺序视为从左到右:在 foldr ,累加器从列表的右侧开始,所以很自然它是第二个参数,而在 foldl 中,情况正好相反。

关于haskell - 对 Haskell lambdas 中的参数感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69252611/

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