弗雷格如何概括数字文字?
How does Frege generalize number literals?
看来弗雷格可以评价
1/2
到return Double值0.5.
文字 1
的类型为 Int
。它似乎被提升为 Double
,它是 Real
class 中的一个类型,因此知道 /
运算符。这是怎么发生的?它是使用 Haskell 方法默默地用 fromInt 1
替换文字 1 还是发生了其他事情?如何选择 Double
作为 Real
的实例在这里使用?是否有像 Haskell 中那样的 "default" 实例类型列表?
没有类型指示符的简单十进制文字(即字母 lndf 之一)在 Frege 中不会自动具有 Int 类型。
它们会被分配到您可能想要的类型,文字也会相应地进行调整。这就是为什么它们被称为 DWIM(做我的意思)文字。
"Differences to Haskell" 文档中提到了这一点。当然,它也应该在语言参考手册中。如果还没有,那一定是作者太懒了。
简而言之,DWIM 是这样工作的:当类型检查器第一次看到文字时,它只是为其分配一个类型变量,并为该类型变量加上一个 Num 约束。随后,在第二遍中,它找到了所有 DWIM 文字。现在,类型变量处于以下状态之一:
- 与某些类型统一,如 Long、Double 等。文字将被相应地键入。
- 与其他类型统一:这是一个错误。
- 与来自类型签名的类型变量统一:文字被替换为应用 fromInt 到类型为 Int 的文字。
- 根本不统一:如果类型变量受 Real(的子类型)约束,则类型为 Double,否则为 Int。
在您的示例中,由于除法运算符的 Real 约束,文字的类型为 Double。
对带有小数点的文字采用类似的方法,但是,它们以 Real 约束开始,因此可以以 Float 或 Double 或 fromDouble 的应用结束。
请注意,除了情况 3 外,在运行时没有类型转换或类型转换。
文字通常不像 Haskell 那样重载的原因是为了避免不必要的 class 约束,因为它们的实现往往会导致昂贵的代码。此外,由于我们没有单态限制,您可能会意外地拥有多态常量。 (想想小谎 = 1:1:...)
使用 DWIM 文字,您可以获得单态常量和函数,除非您需要使用类型注释。
看来弗雷格可以评价
1/2
到return Double值0.5.
文字 1
的类型为 Int
。它似乎被提升为 Double
,它是 Real
class 中的一个类型,因此知道 /
运算符。这是怎么发生的?它是使用 Haskell 方法默默地用 fromInt 1
替换文字 1 还是发生了其他事情?如何选择 Double
作为 Real
的实例在这里使用?是否有像 Haskell 中那样的 "default" 实例类型列表?
没有类型指示符的简单十进制文字(即字母 lndf 之一)在 Frege 中不会自动具有 Int 类型。
它们会被分配到您可能想要的类型,文字也会相应地进行调整。这就是为什么它们被称为 DWIM(做我的意思)文字。
"Differences to Haskell" 文档中提到了这一点。当然,它也应该在语言参考手册中。如果还没有,那一定是作者太懒了。
简而言之,DWIM 是这样工作的:当类型检查器第一次看到文字时,它只是为其分配一个类型变量,并为该类型变量加上一个 Num 约束。随后,在第二遍中,它找到了所有 DWIM 文字。现在,类型变量处于以下状态之一:
- 与某些类型统一,如 Long、Double 等。文字将被相应地键入。
- 与其他类型统一:这是一个错误。
- 与来自类型签名的类型变量统一:文字被替换为应用 fromInt 到类型为 Int 的文字。
- 根本不统一:如果类型变量受 Real(的子类型)约束,则类型为 Double,否则为 Int。
在您的示例中,由于除法运算符的 Real 约束,文字的类型为 Double。
对带有小数点的文字采用类似的方法,但是,它们以 Real 约束开始,因此可以以 Float 或 Double 或 fromDouble 的应用结束。
请注意,除了情况 3 外,在运行时没有类型转换或类型转换。
文字通常不像 Haskell 那样重载的原因是为了避免不必要的 class 约束,因为它们的实现往往会导致昂贵的代码。此外,由于我们没有单态限制,您可能会意外地拥有多态常量。 (想想小谎 = 1:1:...)
使用 DWIM 文字,您可以获得单态常量和函数,除非您需要使用类型注释。