我正在学习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。
我的错在哪里?我不明白,这是如何运作的。
答案 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
的原因。