【问题标题】:How Lambda function works in HaskellLambda 函数在 Haskell 中的工作原理
【发布时间】:2020-04-07 15:46:22
【问题描述】:

我是 Haskell 的新手,在处理小程序时,我发现对 lambda 函数的功能没有什么困惑。

lastThat :: (a -> Bool) -> a -> [a] -> a   
lastThat f = foldl (\x acc -> if f x then x else acc)

执行 lastThat (>0) 100 [-1,-4,5,7,9,-10] 我得到 100 。在使用以下定义时

lastThat :: (a -> Bool) -> a -> [a] -> a   
lastThat f = foldl (\acc x -> if f x then x else acc)

& 然后执行lastThat (>0) 100 [-1,-4,5,7,9,-10] 我得到了预期的9。

为什么它不适用于第一个定义?

【问题讨论】:

  • 因为在前者x累加器,所以你在累加器上调用f
  • 当我使用第一个定义如下firstThat :: (a-> Bool) -> a -> [a] -> a firstThat f = foldr (\x acc -> if f x then x else acc)的foldr时,我得到正确的结果为5但不是100。
  • 但是累加器和元素的顺序在foldrfoldl之间交换。
  • 哦,明白了。谢谢@WillemVanOnsem

标签: haskell lambda functional-programming fold foldleft


【解决方案1】:

foldl 和 foldr 都从左到右遍历列表,但区别在于 foldl 是左关联的,而 foldr 是右关联的

作为列表 (xs) 给出

xs = 1, 2, 3, ....., n

Think like foldl 将初始值放在左侧并将括号关联到左侧。

acc = 0
op = +
(((...(0 + 1) + 2) + 3) + 4) ..... + n)

foldr 将初始值放在右侧并将括号关联到右侧。

acc = 0
op = +
(1 + (2 + (3 + ......+ (n + 0)))...)))

【讨论】:

    猜你喜欢
    • 2017-03-20
    • 1970-01-01
    • 2015-02-26
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    相关资源
    最近更新 更多