(-)貌似有两种不同的类型?


12

在ghci中,当我输入

:t (-)

找出类型(-),它返回

(-) :: Num a => a -> a -> a

但是,当我写-1haskell返回一个数字时,这似乎暗示它(-)是type Num a => a -> a(-)看起来怎么会有两种不同的类型?

Answers:


15

这是该语言的设计决策。-1是一个数字,但在此上下文中的用法与该函数无关(-)。(正如Ackdari在回答中所提到的,此用法与该函数有关negate。)有一些折中方案可以使它起作用:

  1. 您不能正确选择(-)运算符。作为解决方法,Haskell提供了该subtract功能。

  2. 除非在赋值的开头(例如,紧接在=或之后->),否则您不能在没有括号的情况下写一个负整数。这将产生一个解析错误:

    let x = 8 * -1

    相反,应将其写为

    let x = 8 * (-1)

    但是,这很好:

    let x = -1 * 8

这些被认为是语言设计师的合理权衡。


8

它说,答案已经在haskell-wiki中了

一元减号是Prelude函数的语法糖 negate

因此函数(-)始终是a - b函数,如果您编写像let x = -y编译器这样的代码 ,它将转换为let x = negate y


7

一元减法在Haskell中很特殊。如报告第3.4节所述

特殊形式表示前缀取反,这是Haskell中唯一的前缀运算符,并且是的语法。二进制运算符不一定引用Prelude中的定义;它可能会被模块系统反弹。但是,一元将始终引用前奏中定义的功能。运算符的本地含义与一元否定之间没有联系。-enegate (e)---negate-


2
不建议在SO上使用单句答案,也不要在链接中包含内容摘要,因为它们可能会损坏。
Andrew Ray

我是否可以假设与Wiki /教程/ YouTube视频相比,报告/标准的链接也被大大简化了?
bipll

@bipll是的。仅链接答案的问题不是链接目标的质量,而是链接腐烂的风险。如果您在报告的相关部分中进行了复制,那么您的答案就可以了。
约瑟夫·西布尔-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.