如何理解Haskell中的“Currying”?

时间:2012-04-27 20:51:33

标签: haskell

假设有一个名为“smallerc”的函数

    smallerc :: Integer -> (Integer->Integer)
    smallerc x y = if x <=y then x else y

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

    smallerc :: (Integer -> Integer) ->Integer

谢谢!

2 个答案:

答案 0 :(得分:12)

理解currying的关键是理解不存在具有多个参数的函数。 haskell中的每个函数都只有一个参数。但由于->运算符的右关联属性,这并不是立即清楚的。

当你看到这个:

Integer -> Integer -> Integer

相当于:

Integer -> (Integer -> Integer)

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

但是当你这样做时:

(Integer -> Integer) -> Integer

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

答案 1 :(得分:1)

箭头运算符是右关联的。 意思是,你的第一个例子是一个函数接受Integer并返回Integer -> Integer一个函数接受一个整数并返回一个整数。 相比之下,您的第二个示例是使用Integer -> Integer函数并返回Integer的函数。