【问题标题】:How does Frege generalize number literals?弗雷格如何概括数字文字?
【发布时间】:2015-06-16 20:59:35
【问题描述】:

看来弗雷格可以评估

1/2

返回 Double 值 0.5。

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

【问题讨论】:

  • 这是一个很好的问题,因为official language specification 没有提到数字文字的多态性。在 Haskell 中,文字的类型为 Num a => a,这允许它专门用于在该上下文中工作的任何数字类型,这可能是类似的类型魔法在这里发生,但我无法确定在我花了 5 分钟寻找它。

标签: haskell frege


【解决方案1】:

没有类型指示符的简单十进制文字(即字母 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 文字,您可以获得单态常量和函数,除非您需要使用类型注释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-18
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多