将2个参数传递给Haskell中的函数

use*_*121 3 haskell function

在Haskell中,我知道如果我定义这样的函数,add x y = x + y
那么我就这样调用add e1 e2.该调用等同于(add e1) e2
这意味着应用于add一个参数会e1产生一个新函数,然后将该函数应用于第二个参数e2.

这就是我在Haskell中无法理解的.在其他语言(如Dart)中,为了完成上述任务,我会这样做

add(x) {
  return (y) => x + y;
}
Run Code Online (Sandbox Code Playgroud)

我必须明确return一个函数.那么"产生一个新函数然后应用于第二个参数"的部分是否会在Haskell中自动执行?如果是这样,那个"隐藏"功能是什么样的?或者我只是想念哈斯克尔?

utd*_*mir 8

在Haskell中,一切都是价值,

add x y = x + y
Run Code Online (Sandbox Code Playgroud)

只是一个语法糖:

add = \x -> \y -> x + y
Run Code Online (Sandbox Code Playgroud)

有关更多信息:https://wiki.haskell.org/Currying:

在Haskell中,所有函数都被认为是curry:也就是说,Haskell中的所有函数>只接受单个参数.

这主要隐藏在符号中,因此对于新的Haskeller来说可能并不明显.我们来看看这个功能吧

div :: Int -> Int -> Int

执行整数除法.表达式div 2 2毫不奇怪地评估为5.但是还有更多的事情发生,而不是立刻遇到未经训练的眼睛.这是一个由两部分组成的过程.第一,

div 11

被计算并返回一个类型的函数

Int -> Int

然后,结果函数应用于值2,并产生5.您会注意到类型的表示法反映了这一点:您可以阅读

Int -> Int -> Int

错误地称为"接受两个Ints并返回一个Int",但它真正说的是"接受一个I​​nt并返回Int - > Int类型的东西" - 也就是说,它返回一个接受Int并返回一个Int的函数.(可以将类型写为Int x Int - > Int,如果你真的是指前者 - 但由于Haskell中的所有函数都是curry,那不是合法的Haskell.或者,使用元组,你可以写(Int,Int) - > Int,但请记住,元组构造函数(,)本身可以用于curry.)