gpt4 book ai didi

Haskell - 过滤器,柯里化(Currying)

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

我只想知道我对柯里化(Currying)函数的以下理解是否正确。
我要 filter列表中的所有元素 > 4 .我可以这样实现:

filter (>4) [1..10]
  • (>)定义为 Ord a => a -> a -> Bool ,这就是为什么它不能被过滤的原因。
  • (>4)定义为 (Ord a, Num a) => a -> Bool .函数(>)现在被柯里化(Currying)了,仍然需要一个参数。
  • 因为2.,(>4)可以传递给过滤器。
  • 每个传递给过滤器的 List-Element 都将传递给 (>4)和过滤器将验证谓词并返回结果。

  • 它是否正确?

    最佳答案

    推理或多或少是正确的。 (>)是一个带有签名的函数:

    (>) :: Ord a => a -> (a -> Bool)
    所以它是一个函数(就像 Haskell 中的任何其他函数一样)接受一个参数,这里返回一个函数 a -> Bool .
    因此问题是如果我们使用 filter (>) [1,4,2,5] ,然后我们会调用 (>) 1 ,因此这将返回一个函数 a -> Bool , 但是一个 filter不能使用它,它需要一个从列表中获取元素并返回 Bool 的函数,而不是返回映射到 Bool 的函数的函数.
    因此,我们可以例如使用:
    filter ((<) 4) [1,4,2,5]
    因此我们在这里执行 partial application [Haskell-wiki]的功能。这意味着我们生成一个函数 (<) 4 :: (Num a, Ord a) => a -> Bool .因此,我们可以使用该函数进行过滤,因此它将返回 [5] .
    我们还可以使用 lambda 表达式创建一个函数来“交换”参数的顺序:
    filter (\x -> (>) x 4) [1,4,2,5]
    这里的值 x ,因此我们将调用 ((>) x) 4 ,因此这将返回 Bool .
    由于经常会为中缀运算符的两侧之一提供一个值,因此 Haskell 有 sectioning syntax for an infix operator [Haskell-wiki] :
    • (2^) (left section) is equivalent to (^) 2, or more verbosely \x -> 2 ^ x;
    • (^2) (right section) is equivalent to flip (^) 2, or more verbosely \x -> x ^ 2

    所以我们可以将最后一个表达式重写为:
    filter (> 4) [1,4,2,5]

    关于Haskell - 过滤器,柯里化(Currying),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62518111/

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