通过例子理解currying

One*_*ror 0 haskell functional-programming

我正在读某个地方的咖喱功能,听起来很混乱.这个例子让我更加困惑.可以说我有一个功能:

power :: (Int, Float) -> Float -- computes the nth power of b
power (n, b) =
    if n == 0 then 1.0 else b * power (n-1, b)
Run Code Online (Sandbox Code Playgroud)

现在,我定义另一个函数powerc:: Int -> Float -> Float,使得

powerc n b =
    if n == 0 then 1.0 else b * powerc (n-1) b
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下这个功能是如何powerc发布的power.

Cfr*_*Cfr 5

因为powerc现在允许部分应用:

square = powerc 2
Run Code Online (Sandbox Code Playgroud)

顺便说一句,

powerc = curry power
Run Code Online (Sandbox Code Playgroud)

  • `square = powerc 2`定义了一个新函数`square :: Float - > Float`.直观地说,它是`powerc`的一个版本,其中`n`总是2.`b`将是你传递给它的任何东西; 即`square 4 == 16.0`. (3认同)

Ash*_*eyF 5

前者是服用的功能Int, Float元组,而后者则是实质上的功能的链每次取一个单个参数,并返回一个函数取下.

也就是说,powerc取一个Int并返回一个带a 并返回a 的函数.FloatFloat

你可以在部分应用中使用它.例如,square = powerc 2或者cube = powerc 3每个都是Float -> Float具有n捕获值的简单函数.

非咖喱功能不能提供这种简单的部分应用.当前导参数是函数行为的一次性配置时,使用部分应用程序是很好的.在尝试重塑要传递给高阶函数的函数时,它也变得特别有用.例如,您可以映射powerc 2(不定义)列表以将它们全部平方.

希望有所帮助!