看来弗雷格可以评估
1/2
返回 Double 值 0.5。
文字1
的类型是Int
。它似乎被提升为Double
,这是类中的一种类型,Real
因此知道/
运算符。这是怎么发生的?是使用 Haskell 方法将文字 1 静默替换为fromInt 1
还是发生了其他事情?这里如何Double
选择作为Real
使用的实例?是否有像 Haskell 一样的“默认”实例类型列表?
没有类型指示符的简单十进制文字(即字母 lndf 之一)在 Frege 中不会自动具有 Int 类型。
他们将被分配您可能想要的类型,并且文字将相应地进行调整。这就是为什么它们被称为 DWIM(按我的意思)字面量。
这在“与 Haskell 的区别”文档中有所提及。当然,它也应该在语言参考手册中。如果还没有,那一定是作者太懒了。
简而言之,DWIM 的工作方式如下:当类型检查器第一次看到文字时,它只是为其分配一个类型变量,并为该类型变量加上一个 Num 约束。稍后,在第二遍中,它会找到所有 DWIM 文字。现在,类型变量处于以下状态之一:
在您的示例中,由于除法运算符的 Real 约束,文字的类型为 Double 。
带小数点的文字也采用了类似的方法,但是,它们以 Real 约束开始,因此最终可能是 Float 或 Double 或 fromDouble 的应用。
请注意,除了案例 3 之外,在运行时没有类型转换或类型转换。
文字通常不像 Haskell 中那样重载的原因是为了避免不必要的类约束,因为它们的实现往往会导致昂贵的代码。此外,由于我们没有单态限制,您可能会意外地拥有多态常量。(想想 fibs = 1:1:...)
使用 DWIM 文字,您可以获得单态常量和函数,除非您需要使用类型注释。