【问题标题】:Need help in understanding types (based on curry)在理解类型方面需要帮助(基于咖喱)
【发布时间】:2017-04-25 02:03:29
【问题描述】:
 curry f a b = f(a,b)

我想: curry 函数接受函数 f a b 并返回 f(a, b),所以我认为类型是:

(a -> b -> c) -> (a, b) -> c

那么为什么要反转类型呢?:

((a, b) -> c) -> (a -> b -> c)

【问题讨论】:

    标签: haskell currying partial-application


    【解决方案1】:

    我相信你困惑的根源是这段话:

    curry 函数采用函数 f a b

    并非如此:curry 接受一个函数,该函数是 f。至于ab,它们是传递给柯里化函数的参数。更容易看出,通过添加一对多余的括号,使部分应用更加明显......

    (curry f) a b = f (a,b)
    

    ... 或者通过将 ab 移动到右侧,使用 lambda:

    curry f = \a b -> f (a,b)
    

    f 是一个接受一对的函数——注意我们给了它一对 (a,b)。另一方面,curry f 分别采用两个参数。这样一来,curry 的类型确实是:

    curry :: ((a, b) -> c) -> (a -> b -> c)
    

    【讨论】:

      【解决方案2】:

      Curry 只接受一个参数,它是一个函数并返回一个函数。该参数是一个带有签名的函数

      ((a, b) -> c)
      

      即一个接受一个参数的函数:一对事物 a 和 b,并返回另一个事物 c。 Curry 对该函数做了一些神奇的事情,并将其变成了一个新函数:

      (a -> b -> c)
      

      即一个接受两个参数的函数:一个事物 a 和一个事物 b,并返回一个事物 c。

      所以代码:

      curry f a b
      

      就像:

      let newFunction = curry(f)
      newFunction a b
      

      基本上,curry 将一个接受一对的函数转换为一个接受该对作为两个参数的函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-11
        • 1970-01-01
        • 2021-06-26
        • 2011-02-17
        • 2012-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多