为什么在没有括号的情况下不可能在haskell中乘以负数

bes*_*bov 8 syntax haskell

乘以5 * -3haskell gchi给我和错误.但乘法5 * (-3)运作正常.为什么需要括号?

$ ghci
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> 5 * -3

<interactive>:2:1:
    Precedence parsing error
        cannot mix `*' [infixl 7] and prefix `-' [infixl 6] in the same infix expression
Prelude> 5 * (-3)
-15
Prelude>
Run Code Online (Sandbox Code Playgroud)

Don*_*art 13

因为在Haskell 中如何指定一元减号运算符.不幸的是,它有点神奇.这是语言规范的一个奇怪的角落.

一元减号是该语言中唯一的一元运算符.支持一元减法语法只是为了支持negate函数的语法糖.

一方面,这让我们做- 7同样的事情-7.另一方面,它打破了其他的东西,比如节语法.

正如您所看到的,在编写混合固定表达式时会造成混淆.

您需要使用negate来括号,如下所示:

5 * (-3)
Run Code Online (Sandbox Code Playgroud)


Gep*_*ser 5

由于仍然没有可接受的答案,因此我对这个有趣的问题做了一些研究,因为我发现它在另一个地方也没有答案。

简短的答案是:语法不允许这样做。

让我解释一下它的数据化程度,但是首先让我们记住这一点:

在haskell上,运算符是使用后缀符号表示的函数

现在,让我们看看错误消息:

Precedence parsing error
    cannot mix `*' [infixl 7] and prefix `-' [infixl 6] in the same infix expression
Run Code Online (Sandbox Code Playgroud)

那是什么意思 那么,我们应该开始定义什么infixl 7infixl 6有。在他们的语法上,他们有这样的东西:

infixr 9 .
infixr 8 ^, ^^, **
infixl 7 *, /, `quot`, `rem`, `div`, `mod`
infixl 6 +, -
infixr 5 :
infix 4 ==, /=, <, <=, >=, >
infixr 3 &&
infixr 2 ||
infixl 1 >>, >>=
infixr 1 =<<
infixr 0 $, $!, `seq`
Run Code Online (Sandbox Code Playgroud)

注意:您可以在标准前奏中看到这一点

它们在错误消息上的意思是您不能使用来连接infixl 7元素infixl 6,这与不能执行以下操作的原因相同:

Prelude> 5 * +3
Run Code Online (Sandbox Code Playgroud)

您将收到此错误:

parse error on input `+'
Run Code Online (Sandbox Code Playgroud)

等待,如果这是一个sintax错误,为什么错误消息有所不同?

好吧,这似乎unary "-" operator在haskell中非常特殊(如其他答案所说),并且正在语法的其他部分使用,因此,从理论上讲,这将转到语法树的另一个分支,并将在其他地方引发错误。

如果您想了解更多有关的信息unary "-" operator,可以转到此处