为什么 Haskell 数字字面量需要以数字开头和结尾?

3
Haskell 98报告中,它说:
浮点字面量必须包含小数点前后的数字;这确保小数点不能被误认为是另一种使用点字符的方式。
还有什么其他用途?我无法想象出任何这样的合法表达式。
(为了澄清动机:我知道很多人经常写像9.00.7这样的数字,而不需要,但我无法完全接受这一点。我可以接受0.7而不是更紧凑但其他方面没有改善的.7,但是除非它们表示某些量精确到十分之一,否则超出的尾随零对我来说感觉很奇怪,在Haskell让我写9.0-数字的场合很少发生。)
我忘记了可以在不加空格的情况下编写函数组合!当然,这是一个可能性,但是可以通过贪婪地解析浮点文字来避免这个问题,以便replicate 3 . pred$8((replicate 3) . pred) 8,但replicate 3.pred$8(replicate 3.0 pred)8


是否存在这样的表达式,其中整数字面值必须直接紧挨着.,而没有空格?


1
你自己就是最好的例子,说明为什么数字字面值不应该以'.'结尾或开头。你提出的“解决方案”听起来像是一个糟糕的hack - 至少它破坏了正交性(即为什么我可以写abs 3+b但不能写max 3.b当我想表达的是(.) (max 3) b)。 - Ingo
1
@Ingo,为了记录,这个例子是从Rotsor的答案中提取的。至于正交性:你也不能做max A.b(其中A是一个具有Ord实例的数据构造器,以便(.) (max A) b是合法的)。 - leftaroundabout
4个回答

5

其他用途的一个例子是点运算符(或以点开头或结尾的任何其他运算符):replicate 3.pred$8

另一个可能的用途是范围表达式:[1..10]

此外,您几乎总是可以写成9而不是9.0,从而避免完全使用.的需要。


事实上,能够为任何Num实例编写“整数”字面量是Haskell的一大优点。至于范围,它们似乎很明确,不是吗?至少[1.0 0.10]是非法的。 - leftaroundabout
@leftaroundabout 哦,但你错了!在lambdabot中尝试一下:它会评估为1.0。你所需要的只是一个Num函数实例。 - Daniel Wagner

3

最常见的使用 (.) 的方法是函数合成。因此,Haskell 编译器将 a . 1 解释为将函数 a 与数字组合在一起,并不知道该怎么做;类似地,反过来也一样。可以在此处找到 (.) 的其他用法

我不知道 .70.7 的其他问题。


3

我认为允许使用'9.'和'.7'并没有太大的问题。我认为当前的设计更多地反映了Haskell的原始设计者的想法。


2

虽然它可能被区分开来,但我认为允许.77.并没有太多好处。代码既要被人类阅读,也要被机器读取,而在字面量的两端意外地错过小数点比在中间容易得多。

我更注重可读性,而不是节省字节。


3
如果人们习惯了末尾有零的表示法,那么这是一个论点——如果他们确实这样做了。在计算机科学中可能是这样的,但在科学和工程中,末尾的零代表额外的精度信息,因此对我们来说,这相当令人困惑并且会降低可读性。至于省略开头的零,我不能争辩,这更像是我自己的习惯,从我使用 QBasic 的时候就一直保持着,几乎每个人都告诉我要停止这样做。 - leftaroundabout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接