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



我正在学习Haskell自动取款机,现在我找到了这个功能

const const (negate 1) (negate 2) 3

此函数的结果为 -2。我不明白为什么结果不是-2。

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

所以我想我也可以像这样设置括号:常量 (常量 (否定 1) (否定 2)) 3但是现在我得到-1的结果。

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

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)作为其常量值,并继续忽略3 .

括号

需要这样设置:

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

现在(const const)属于 a -> b -> c -> b 型,应该很清楚为什么结果是 -2 .

最新更新