如何理解Haskell中的"Currying"?

XIA*_*ang 2 haskell

假设有一个名为"smallc"的函数

    smallerc :: Integer -> (Integer->Integer)
    smallerc x y = if x <=y then x else y
Run Code Online (Sandbox Code Playgroud)

为什么不使用以下方式声明函数:

    smallerc :: (Integer -> Integer) ->Integer
Run Code Online (Sandbox Code Playgroud)

谢谢!

sen*_*rle 12

理解currying的关键是理解不存在具有多个参数的函数.haskell中的每个函数都只有一个参数.但由于->运营商的右关联属性,这一点并不是很明确.

当你看到这个:

Integer -> Integer -> Integer
Run Code Online (Sandbox Code Playgroud)

它相当于:

Integer -> (Integer -> Integer)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,函数都接受Integer返回一个函数.(返回的函数是一个接受Integer并返回的函数Integer.)所以这可能类似于简单的数学运算; 它需要一个Integer(假设为5)并返回一个带另一个Integer(再次为5)的函数并将其添加到第一个函数,并返回结果(10).

但是当你这样做时:

(Integer -> Integer) -> Integer
Run Code Online (Sandbox Code Playgroud)

你创造了一些非常不同的东西 - 一个接受一个函数并返回一个函数的函数Integer.这也可以是实现数学函数的一种方式; 但不是Integer把第一个参数作为第一个参数,而是采用数学运算本身!因此,例如,假设您向此函数传递一个函数,该函数将5传递给它.然后该函数传递5函数,并返回结果(10).

  • 类型为`(Integer - > Integer) - > Integer`的函数的具体示例是`supplyFive f = f 5`.他的具体例子是`supplyFive(+5)`,其评估为"10". (3认同)