繁体   English   中英

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

[英]How does Frege generalize number literals?

似乎弗雷格可以评估

1/2

返回Double值0.5。

文字1Int类型。 它似乎被提升为Double ,它是Real类中的一个类型,因此知道/运算符。 这是怎么发生的? 它是否使用Haskell方法静默地用fromInt 1替换文字fromInt 1或者是其他的东西? 如何选择Double作为Real的实例在这里使用? 是否有像Haskell一样的“默认”实例类型列表?

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

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

这在“与Haskell的差异”文档中提到。 当然,它也应该在语言参考手册中。 如果它还没有,那一定是因为作者非常懒惰。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM