在理解类型方面需要帮助(基于 curry)
Need help in understanding types (based on curry)
curry f a b = f(a,b)
我想:
curry 函数采用函数 f a b 和 returns f(a, b),所以我认为类型是:
(a -> b -> c) -> (a, b) -> c
那么为什么类型是反的呢?:
((a, b) -> c) -> (a -> b -> c)
Curry 只接受一个参数,它是一个函数,returns 一个函数。该参数是一个带有签名
的函数
((a, b) -> c)
即一个接受一个参数的函数:一对事物 a 和 b 以及 returns 另一事物 c。 Curry 对该函数做了一些神奇的事情,并将其变成了一个新函数:
(a -> b -> c)
即一个接受两个参数的函数:一个东西 a 和一个东西 b 和 returns 一个东西 c。
所以代码:
curry f a b
就像:
let newFunction = curry(f)
newFunction a b
基本上,curry 将一个接受一对的函数转换为一个接受该对作为两个参数的函数。
我相信您困惑的根源是这段话:
the curry function takes function f a b
不是真的:curry
有一个函数,那个函数是 f
。至于 a
和 b
,它们是传递给柯里化函数的参数。更容易看出,通过添加一对多余的括号,使部分应用更加明显...
(curry f) a b = f (a,b)
... 或者通过将 a
和 b
移到右侧,使用 lambda:
curry f = \a b -> f (a,b)
f
是一个接受一对的函数——注意我们给它一对,(a,b)
。另一方面,curry f
分别接受两个参数。既然如此,curry
的类型确实是:
curry :: ((a, b) -> c) -> (a -> b -> c)
curry f a b = f(a,b)
我想: curry 函数采用函数 f a b 和 returns f(a, b),所以我认为类型是:
(a -> b -> c) -> (a, b) -> c
那么为什么类型是反的呢?:
((a, b) -> c) -> (a -> b -> c)
Curry 只接受一个参数,它是一个函数,returns 一个函数。该参数是一个带有签名
的函数((a, b) -> c)
即一个接受一个参数的函数:一对事物 a 和 b 以及 returns 另一事物 c。 Curry 对该函数做了一些神奇的事情,并将其变成了一个新函数:
(a -> b -> c)
即一个接受两个参数的函数:一个东西 a 和一个东西 b 和 returns 一个东西 c。
所以代码:
curry f a b
就像:
let newFunction = curry(f)
newFunction a b
基本上,curry 将一个接受一对的函数转换为一个接受该对作为两个参数的函数。
我相信您困惑的根源是这段话:
the curry function takes function f a b
不是真的:curry
有一个函数,那个函数是 f
。至于 a
和 b
,它们是传递给柯里化函数的参数。更容易看出,通过添加一对多余的括号,使部分应用更加明显...
(curry f) a b = f (a,b)
... 或者通过将 a
和 b
移到右侧,使用 lambda:
curry f = \a b -> f (a,b)
f
是一个接受一对的函数——注意我们给它一对,(a,b)
。另一方面,curry f
分别接受两个参数。既然如此,curry
的类型确实是:
curry :: ((a, b) -> c) -> (a -> b -> c)