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