如何理解curry/uncurry的函数定义

How to understand the function definitions of curry/uncurry

来自 http://www.seas.upenn.edu/~cis194/lectures/02-lists.html

的关于 curry/uncurry(schönfinkel/unschönfinkel) 的定义
schönfinkel :: ((a,b) -> c) -> a -> b -> c
schönfinkel f x y = f (x,y)

unschönfinkel :: (a -> b -> c) -> (a,b) -> c
unschönfinkel f (x,y) = f x y

但我认为上面这些函数定义应该是:

schönfinkel :: ((a,b) -> c) -> a -> b -> c
schönfinkel f (x,y) = f x y
-- schönfinkel(curry) converts an uncurried function 
-- (f (x,y), its type signature is (a,b) -> c)  
-- to a curried function
-- (f x y, its type signature is  a -> b -> c) 

unschönfinkel :: (a -> b -> c) -> (a,b) -> c
unschönfinkel f x y = f (x,y)
-- unschönfinkel(uncurry) converts a curried function  
-- (f x y , its type signature is a -> b -> c) 
-- to an uncurried function
-- (f (x,y), its type signature is (a,b) -> c)

有人能给我一个简单的解释吗?

这是 Groovy Dierk & Co 的 In Action

中关于咖喱的一小段解释

基本思路是取一个带多个参数的函数 并通过固定一些值将其转换为参数较少的函数。一个经典的例子是选择一些任意值 n 并将一个将两个参数相加的函数转换为一个接受单个参数并将 n 添加到它的函数。

Groovy 有一个名为 curry 的内置闭包方法,它采用任意值绑定到闭包参数和 return 将值绑定到各自的参数后闭包的克隆。详细理解请参考以下link

Groovy functional programming

您可能误读/误解了初始代码,适当的缩进可能足以使其正确:

schönfinkel :: ((a,b) -> c) -> a -> b -> c
schönfinkel    f               x    y =  f (x,y)

unschönfinkel :: (a -> b -> c) -> (a,b) -> c
unschönfinkel    f                (x,y) =  f x y

现在,让我们打开 ghci 并尝试一些操作:

>>> let schönfinkel f x y = f (x,y)

>>> let toBeCurried (x,y) = x ++ y
>>> :t toBeCurried
toBeCurried :: ([a], [a]) -> [a]

>>> :t schönfinkel toBeCurried
schönfinkel toBeCurried :: [a] -> [a] -> [a]

看看您给出的非正式定义,您会发现它符合 schönfinkel 的行为。