Function 向Haskell中的函数传递2个参数
在Haskell中,我知道如果我定义这样的函数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中自动执行?如果是,那么“
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最基本的优化之一是,如果中间闭包仅用于立即应用于已知参数,则不必费心进行中间闭包。