弗雷格如何概括数字文字?

Die*_*erk 6 haskell frege

似乎弗雷格可以评估

1/2
Run Code Online (Sandbox Code Playgroud)

返回Double值0.5.

文字1属于类型Int.它似乎被提升为Double,这是类中的一种类型Real,因此知道/运算符.这是怎么发生的?它是否正在使用Haskell方法静默替换文字1 fromInt 1或正在进行其他事情?如何Double选择在Real这里使用的实例?是否有像Haskell一样的"默认"实例类型列表?

Ing*_*ngo 3

没有类型指示符的简单十进制文字(即字母 lndf 之一)在 Frege 中不会自动具有 Int 类型。

它们将被分配您可能想要的类型,并且文字将相应地进行调整。这就是为什么它们被称为 DWIM(照我的意思做)文字。

这在“Differences to Haskell”文档中提到。当然,它也应该包含在语言参考手册中。如果还没有,那一定是因为作者太懒了。

简而言之,DWIM 的工作原理如下:当类型检查器第一次看到文字时,它只是为其分配一个类型变量,以及该类型变量的 Num 约束。随后,在第二遍中,它找到所有 DWIM 文字。现在,类型变量处于以下状态之一:

  1. 与某种类型统一,如 Long、Double 等。将相应地键入文字。
  2. 与其他类型统一:这是一个错误。
  3. 与类型签名中的类型变量统一:文字被应用 fromInt 替换为 Int 类型的文字。
  4. 根本不统一:如果类型变量受 Real(子类型)约束,则类型为 Double,否则为 Int。

在您的示例中,由于除法运算符的 Real 约束,文字的类型为 Double。

对于带有小数点的文字,采用类似的方法,但是,它们以 Real 约束开始,因此最终可以为 Float 或 Double 或 fromDouble 的应用。

请注意,除了情况 3 之外,运行时没有类型转换或类型转换。

文字通常不像 Haskell 那样重载的原因是为了避免不必要的类约束,因为它们的实现往往会导致昂贵的代码。另外,由于我们没有单态性限制,因此您可能会意外地拥有多态常量。(认为​​小纤维 = 1:1:...)

使用 DWIM 文字,您可以获得单态常量和函数,除非您需要类型注释。