如何理解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
您可能误读/误解了初始代码,适当的缩进可能足以使其正确:
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
的行为。
来自 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
您可能误读/误解了初始代码,适当的缩进可能足以使其正确:
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
的行为。