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

时间:2015-03-03 04:58:53

标签: haskell

关于来自http://www.seas.upenn.edu/~cis194/lectures/02-lists.html的咖喱/不发情(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)

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

2 个答案:

答案 0 :(得分:4)

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

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的行为相符。

答案 1 :(得分:-5)

以下是关于Dierk&amp ;;的Groovy In Action咖喱的一小段解释。共

基本思想是采用具有多个参数的函数 并通过修复一些值将其转换为具有较少参数的函数。一个典型的例子是选择一些任意值n,并将一个将两个参数相加的函数转换为一个函数,该函数接受一个参数并向其中添加n。

Groovy有一个内置的Closure方法叫做 curry ,它接受任意值绑定到闭包参数,并在绑定后返回闭包的克隆相应参数的值。请参阅以下链接以获取详细信息

Groovy functional programming