在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中自动执行?如果是这样,那个"隐藏"功能是什么样的?或者我只是想念哈斯克尔?
在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",但它真正说的是"接受一个Int并返回Int - > Int类型的东西" - 也就是说,它返回一个接受Int并返回一个Int的函数.(可以将类型写为Int x Int - > Int,如果你真的是指前者 - 但由于Haskell中的所有函数都是curry,那不是合法的Haskell.或者,使用元组,你可以写(Int,Int) - > Int,但请记住,元组构造函数(,)本身可以用于curry.)