这个函数是如何工作的:const const(否定1)(否定2)3

时间:2015-04-21 13:18:19

标签: function haskell functional-programming

我正在学习Haskell atm,现在我找到了这个函数

const const (negate 1) (negate 2) 3

此功能的结果是 -2 。我不明白为什么结果不是-2。

const :: a -> b -> a
negate :: Num a => a -> a

所以我认为我也可以像这样设置括号: const(const(否定1)(否定2))3 但是现在我得到了-1。

我的错在哪里?我不明白,这是如何运作的。

2 个答案:

答案 0 :(得分:12)

Haskell解析规则非常简单。如果我们忽略中缀运算符(+&&等),则只有一条规则:

  

a b c d e被解析为(((a b) c) d) e

从不,就像您假设的那样,a (b c d) e。 (很少,这可能会巧合地给出相同的结果,但通常它甚至对类型检查器都没有意义。)

因此,在您的示例中,您必须将其视为

( ( (const const) (negate 1) ) (negate 2) ) 3

其中const const只是忽略(negate 1),而是产生const。它会选择(negate 2)作为其const值,然后忽略3

答案 1 :(得分:4)

括号需要像这样设置:

(((const const) (negate 1)) (negate 2)) 3

现在(const const)属于a -> b -> c -> b类型,应该清楚结果为-2的原因。