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

bas*_*354 4 haskell functional-programming function

我正在学习Haskell atm,现在我发现了这个功能

const const (negate 1) (negate 2) 3
Run Code Online (Sandbox Code Playgroud)

该函数的结果是-2.我不明白为什么结果不是-2.

const :: a -> b -> a
negate :: Num a => a -> a
Run Code Online (Sandbox Code Playgroud)

所以我认为我也可以像这样设置括号:const(const(negate 1)(negate 2))3但是现在我得到-1作为结果.

我的错在哪里?我不明白,这是怎么回事.

lef*_*out 12

Haskell解析规则非常简单.如果我们忽略缀操作符(+,&&等),只有一个规则:

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

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

所以在你的例子中,你必须把它读作

( ( (const const) (negate 1) ) (negate 2) ) 3
Run Code Online (Sandbox Code Playgroud)

在那里const const简单地忽略了(negate 1),而const不是屈服.它将选择(negate 2)作为其const值,然后继续忽略3.