需要帮助理解类型(基于咖喱)

时间:2017-04-25 02:03:29

标签: haskell currying partial-application

 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)

2 个答案:

答案 0 :(得分:3)

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

  

咖喱功能采用函数f a b

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

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

...或通过lambda将ab移到右侧:

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

f是一个成对的函数 - 请注意我们给它一对,(a,b)。另一方面,curry f分别取两个论点。既然如此,curry的类型确实是:

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

答案 1 :(得分:1)

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

((a, b) -> c)

即。一个带有一个参数的函数:一对东西a和b并返回另一个东西c。库里为这个功能做了一些神奇的事情并把它变成了一个新功能:

(a -> b -> c)

即。一个带有两个参数的函数:一个东西和一个东西b并返回一个东西c。

所以代码:

curry f a b

就像:

let newFunction = curry(f)
newFunction a b

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