深刻理解currying的例子

时间:2016-07-13 21:54:39

标签: haskell currying

阅读https://wiki.haskell.org/Currying

它声明:

  

很多时候,新程序员可以忽略curry。该   将所有功能视为咖喱的主要优点是   理论:当处理所有函数时,形式证明更容易   统一(一个参数,一个结果)。话虽如此,那里   是您需要了解的Haskell习语和技巧   钻营。

什么是Haskell技术/成语,需要更深入地了解currying?

1 个答案:

答案 0 :(得分:1)

部分功能应用程序并不是Haskell的一个独特功能;这只是咖喱功能的结果。

map :: (a -> b) -> [a] -> [b]

在像Python这样的语言中,map 始终采用两个参数:类型为a -> b的函数和类型为[a]的列表

map(f, [x, y, z]) == [f(x), f(y), f(z)]

这要求您假装->语法仅用于展示,并且->(a -> b)之间的[a]与之间的[a] -> [b]不同map。但事实并非如此;它是精确相同的运算符,它是右关联的。 map :: (a -> b) -> ([a] -> [b]) 的类型可以明确括号为

map

突然之间,您可能只向[a] -> [b]提供一个参数(函数)并返回类型为-> new 函数,这似乎不那么有趣。这就是所有部分功能应用是:利用所有功能都是咖喱的事实。

实际上,你从来没有给函数提供过多个参数。为了使map f [1,2,3] 与权利相关联,函数应用程序 left -associative,这意味着像

这样的“多参数”调用
(map f) [1,2,3]

实际上是两个函数应用程序,如果我们将它括起来就会变得更清晰。

map

f首先“部分”应用于一个参数[1,2,3],它返回一个新函数。 然后将此函数应用于top以获得最终结果。