为什么Haskell采用一个参数

时间:2016-05-05 01:27:33

标签: haskell currying

我正在试图找出“Currying”背后的原因和结果逻辑,并得出以下结果:

  1. 多个参数函数可以表示为元组(将多个参数与不同类型组合为一个参数)和列表(组合多个参数,其类型与一个参数相同)。所以所有函数都可以表示为单个参数函数。
  2. 所以在Haskell中,函数只接受一个参数。我们如何实现多参数函数。
  3. 使用Currying。 Currying是实现多个arguemnts函数的一种方式。
  4. 我认为上面的逻辑1 - > 2 - > 3很难回答“为什么要使用currying”。对于语句3,还可以将多个元组或列表组合为单个参数来实现多个参数函数。

    似乎陈述1不是陈述2的正确理由。我确定是2> 3是正确的推理,但是2背后的原因是什么?为什么Haskell作为一种函数式语言只需要一个参数?

    大多数书籍将陈述2视为公认的事实。有谁知道2背后的原因?或者有人知道“为什么要讨好”背后的正确逻辑?

3 个答案:

答案 0 :(得分:5)

使用currying作为多参数函数的首选方法的决定有两个原因。首先,Haskell的根源在于使用currying的lambda演算。其次,currying允许简单的部分应用,这是一个难以言喻的有用的语言方面。

答案 1 :(得分:4)

功能

f x y = x + y

有类型(假设x& yInteger s)

f :: Integer -> Integer -> Integer

这与

相同
g :: Integer -> (Integer -> Integer)

这意味着f是一个函数,它接受Integer并返回一个新函数,该函数也需要Integer并返回Integer。 Currying是一个过程,其中一个带有多个参数的函数实际上被评估为一系列带有一个参数的函数。

Currying使部分应用函数非常容易,如下所示

plusTwo :: Integer -> Integer
plusTwo = f 2

上述代码只是将2应用于f,并将名称plusTwo绑定到生成的函数。

这使得开发人员可以非常轻松地将常见行为抽象到一个地方。

答案 2 :(得分:2)

首先,你需要记住Haskell完全基于Lambda微积分。它是基于科学编程模型(即使它并不意味着语言只有科学用途)。

我认为你错了,是不是只有一个参数,因为它可以显示为元组或列表,即使这是一个非常聪明的解释。

由于Currying,Haskell只接受一个参数:

f(x,y)= f(x)(y)

其中f(x)返回一个带有一个参数的函数。 Currying是整个“返回函数的函数”方案。所以,当你f(x)(y)时,你实际上是将'y'传递给'f(x)'函数。

经典例子:

add :: a->(a->a)
add(x) = x'+'

由于'+'是一个函数,这意味着它需要另一个参数,我们可以:

add(3)(5) == 8

我们没有将两个参数传递给 add ,只有一个参数可以生成'+'来获取另一个参数。

在你意识到这一点之后,会有很多意义,我们可以继续解释原因。

嗯,主要是合成糖,但非常强大。例如,我们可以基于其他函数定义函数,而无需指定参数:

add = '+'

突然我在不提及参数的情况下为函数赋值(当然假设它们的类型声明匹配)。这有很多其他的可能性,并且很容易抽象。

这里有很好的例子:https://softwareengineering.stackexchange.com/questions/185585/what-is-the-advantage-of-currying