Function 向Haskell中的函数传递2个参数

Function 向Haskell中的函数传递2个参数,function,haskell,Function,Haskell,在Haskell中,我知道如果我定义这样的函数addxy=x+y 然后我像这样调用adde1e2。该调用相当于(添加e1)e2 这意味着将add应用于一个参数e1将产生一个新函数,然后将该函数应用于第二个参数e2 这就是我在哈斯克尔身上不明白的。在其他语言(如Dart)中,要完成上述任务,我会这样做 add(x) { return (y) => x + y; } 我必须显式地返回一个函数。那么“生成一个新函数,然后应用到第二个参数”部分是否会在Haskell中自动执行?如果是,那么“

在Haskell中,我知道如果我定义这样的函数
addxy=x+y

然后我像这样调用
adde1e2
。该调用相当于
(添加e1)e2

这意味着将
add
应用于一个参数
e1
将产生一个新函数,然后将该函数应用于第二个参数
e2

这就是我在哈斯克尔身上不明白的。在其他语言(如Dart)中,要完成上述任务,我会这样做

add(x) {
  return (y) => x + y;
}

我必须显式地
返回一个函数。那么“生成一个新函数,然后应用到第二个参数”部分是否会在Haskell中自动执行?如果是,那么“隐藏”函数是什么样子的?或者我只是误解了Haskell?

在Haskell中,一切都是价值

add x y = x + y
只是一个语法糖:

add = \x -> \y -> x + y
有关更多信息:

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

这主要隐藏在符号中,因此对于一个新手来说可能并不明显 哈斯凯勒。让我们来看看函数

div::Int->Int->Int

它执行整数除法。表达式div 11 2 毫不奇怪,计算结果为5。但现在发生的事情远不止这些 立即与未经训练的眼睛相遇。这是一个分为两部分的过程。首先,

div 11

计算并返回类型为的函数

Int->Int

然后将得到的函数应用于值2,得到5。 您会注意到类型的符号反映了这一点:您可以阅读

Int->Int->Int

错误为“接受两个整数并返回一个整数”,但它是什么 真正的意思是“接受一个Int并返回Int类型的东西 ->Int”--也就是说,它返回一个函数,该函数接受一个Int并返回一个Int 实际上指的是前者——但由于Haskell中的所有函数都是 curried,这不是合法的Haskell。或者,使用元组,你可以 可以编写(Int,Int)->Int,但请记住,元组 构造函数(,)本身可以是curry。)


返回的函数如何知道
11
?它是否将
11
存储在内存中,然后将
2
作为它的参数。返回的函数是一个在创建时捕获11的函数,还要注意的是,GHC最基本的优化之一是,如果中间闭包仅用于立即应用于已知参数,则不必费心进行中间闭包。