为什么 Haskell 接受一个参数

Why Haskell takes one argument

我试图弄清楚"Currying"背后的因果逻辑,得出以下结果:

  1. 多参数函数可以表示为元组(将多个不同类型的参数组合为一个参数)和列表(将多个相同类型的参数组合为一个参数)。所以所有函数都可以表示为单参数函数。
  2. 所以在Haskell中,函数只有一个参数。我们如何实现多参数函数。
  3. 使用柯里化。 Currying 是一种实现多个 arguemnts 函数的方法。

我认为上面的逻辑 1 -> 2 -> 3 很难回答 "why using currying"。对于语句3,也可以将多个元组或列表组合为一个参数来实现多参数函数。

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

大多数书籍都将陈述 2 视为公认的事实。有人知道2背后的原因吗?或者有人知道 "why currying" 背后的正确逻辑吗?

函数

f x y = x + y

具有类型(假设 xyIntegers)

f :: Integer -> Integer -> Integer

这与

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

这意味着 f 是一个接受 Integer 和 returns 的函数,一个新函数也接受 Integer 和 returns 一个 Integer。 Currying 是一个过程,在这个过程中,一个接受多个参数的函数实际上被评估为一系列接受一个参数的函数。

柯里化使得部分应用函数变得非常容易,如下所示

plusTwo :: Integer -> Integer
plusTwo = f 2

上面的代码只是将 2 应用到 f 并将名称 plusTwo 绑定到结果函数。

这使得开发人员非常容易将常见行为抽象到一个地方。

首先,您需要记住 Haskell 完全基于 Lambda 微积分。它是建立在科学编程模型之上的(尽管这并不意味着该语言只有科学用途)。

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

Haskell 因为柯里化只需要一个参数:

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

其中 f(x) returns 一个接受一个参数的函数。柯里化就是整个 "Functions that returns functions" 方案。因此,当您 f(x)(y) 时,您实际上是将 'y' 传递给 'f(x)' 函数。

经典例子:

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

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

add(3)(5) == 8

我们不会将两个参数都传递给 add,而是只传递一个参数,这样它就可以生成“+”,从而得到另一个参数。

在你理解之后,会很有意义,我们可以继续研究原因。

好吧,主要是合成糖,但是非常强大。比如我们可以定义基于other的函数而不指定参数:

add = '+'

然后我突然给函数赋值而没有提及参数(当然假设它们的类型声明匹配)。这有很多其他的可能性,并且大大简化了抽象。

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

决定使用柯里化作为多参数函数的首选方法有两个原因。首先,Haskell 牢牢扎根于使用柯里化的 lambda 演算。其次,柯里化允许简单的部分应用,这是一个非常有用的语言方面。