在Haskell中,我知道如果我定义一个像add x y = x + y
这样的函数
然后我打电话给这个add e1 e2
。该电话相当于(add e1) e2
这意味着将add
应用于一个参数e1
会产生一个新函数,然后将其应用于第二个参数e2
。
这就是我在Haskell中无法理解的。在其他语言(如Dart)中,为了完成上述任务,我会这样做
add(x) {
return (y) => x + y;
}
我必须明确return
一个函数。那么“产生一个新函数然后应用于第二个参数”的部分是否会在Haskell中自动执行?如果是这样,那个“隐藏”功能是什么样的?或者我只是想念哈斯克尔?
答案 0 :(得分:6)
在Haskell中,一切都是值,
add x y = x + y
只是一个语法糖:
add = \x -> \y -> x + y
有关详细信息:https://wiki.haskell.org/Currying:
在Haskell中,所有函数都被认为是curry:即,所有函数>在Haskell中只需要一个参数。
这主要隐藏在符号中,因此对于新的可能并不明显 Haskeller。让我们来看看函数
div :: Int -> Int -> Int
执行整数除法。表达式div 11 2 毫不奇怪,评估为5.但是还有更多的事情要发生 立即遇见未经训练的眼睛。这是一个由两部分组成的过程。首先,
div 11
被评估并返回类型为
的函数
Int -> Int
然后将得到的函数应用于值2,得到5。 您会注意到类型符号反映了这一点:您可以阅读
Int -> Int -> Int
错误地"需要两个Ints并返回一个Int",但它是什么 真的说是"接受一个Int并返回Int类型的东西 - > INT" - 也就是说,它返回一个接受Int并返回Int的函数。 (如果您可以将类型写为Int x Int - > Int 真的是前者 - 但是因为Haskell中的所有功能都是 咖喱,这不是合法的Haskell。或者,使用元组,你 可写(Int,Int) - > Int,但请记住元组 构造函数(,)本身可以用于curry。)