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

时间:2015-01-31 07:37:23

标签: function haskell

在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中自动执行?如果是这样,那个“隐藏”功能是什么样的?或者我只是想念哈斯克尔?

1 个答案:

答案 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",但它是什么   真的说是"接受一个I​​nt并返回Int类型的东西    - > INT" - 也就是说,它返回一个接受Int并返回Int的函数。 (如果您可以将类型写为Int x Int - > Int   真的是前者 - 但是因为Haskell中的所有功能都是   咖喱,这不是合法的Haskell。或者,使用元组,你   可写(Int,Int) - > Int,但请记住元组   构造函数(,)本身可以用于curry。)