乘以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)
由于仍然没有可接受的答案,因此我对这个有趣的问题做了一些研究,因为我发现它在另一个地方也没有答案。
简短的答案是:语法不允许这样做。
让我解释一下它的数据化程度,但是首先让我们记住这一点:
现在,让我们看看错误消息:
Precedence parsing error
cannot mix `*' [infixl 7] and prefix `-' [infixl 6] in the same infix expression
Run Code Online (Sandbox Code Playgroud)
那是什么意思 那么,我们应该开始定义什么infixl 7和infixl 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,可以转到此处。
| 归档时间: |
|
| 查看次数: |
5574 次 |
| 最近记录: |