【问题标题】:Using foldr and a lambda expression as its first argument [closed]使用 foldr 和 lambda 表达式作为其第一个参数 [关闭]
【发布时间】:2020-11-06 16:20:21
【问题描述】:

我正在尝试弄清楚如何使用 lambda 表达式,我发现它们通常用于 foldl 或 foldr 等函数中。

我想知道为什么下面的代码不起作用:

ExMin = foldr (\x y -> x < y) 5 [1,2,3,4]

我希望这个函数给我列表中的最小数字,但是它给出了错误。 我在想它出错的原因是因为 x

关于如何让它正确返回数字的任何想法?

【问题讨论】:

  • foldr (\x y -&gt; x &lt; y) 5 [1,2,3,4] 将评估为 1 &lt; (2 &lt; (3 &lt; (4 &lt; 5)))) 这是错误的类型,因为它试图将数字与布尔值进行比较。 lambda 必须返回可以反馈给与第二个参数相同的 lambda 的东西,即它必须具有 a -&gt; b -&gt; b 形式的类型。

标签: list haskell lambda


【解决方案1】:

我想知道为什么下面的代码不起作用:

ExMin = foldr (\x y -> x < y) 5 [1,2,3,4]

因为 foldr 函数采用类型为 a -&gt; b -&gt; b 的折叠函数,其中 b 是“累加器”的类型,该值从右到左传递,每次都作为折叠函数的输入和另一个元素。最终 foldr 返回累加器的最终值。

关于如何让它正确返回数字的任何想法?

是的,您可以使用min :: Ord a =&gt; a -&gt; a -&gt; a 函数。这将每次返回累加器和一个元素的最小值:

ExMin = foldr <b>min</b> 5 [1,2,3,4]

作为@amalloy says,您不能使用以U大写开头的变量,这应该是小写:

<b>exMin</b> = foldr min 5 [1,2,3,4]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多