5

我喜欢阅读有关编程理论的内容,那么您能否告诉我是否有任何面向对象的静态类型语言允许变量具有几种类型?伪代码示例:

var value: BigInteger | Double | Nil

我考虑在这个对象上调用方法的方式。如果对象的类型为BigInteger | 双语言可以允许用户只调用共享方法(湖加,减),但当类型为BigInteger | 双 | Nil那么 Nil 的对象没有方法加减法,所以我们不能对这个对象做任何有用的事情,因为它只有很少的共享方法(如 toString)。

那么有什么想法应该如何在静态类型的面向对象语言中调用具有少量类型的变量的方法?

4

6 回答 6

8

你所描述的是一个交集类型。例如,它们确实存在于 Java中,但它们仅作为捕获转换和类型推断的结果出现在类型检查器中。你不能自己写一个。

我不知道任何直接使用它们的语言,但它们通常用于描述分析语言的类型系统,特别是实际上没有类型系统的语言。例如,Diamondback Ruby 是一个静态类型系统和动态类型 Rub​​y 编程语言的类型推断器,它同时使用联合和交集类型。

请注意,您使用的语法通常用于表示联合类型,它们是交集类型的对偶。交集类型一般都写成A & B & C.

于 2010-09-12T00:03:09.227 回答
5

我不知道有什么语言可以做到这一点……遗憾的是,我很想玩弄它(但首先,他们应该采用类型推断和参数多态性;))。

虽然它是可能的:在结构类型系统中相对优雅(如果 a 拥有 b 所拥有的一切,则类型 a 是类型 b 的子类型),只需为 value 指定一个类型,它是BigIntegerand ofDouble和 of的结构子类型,Nil稍微不那么优雅在主格类型系统中(类型 a 是类型 b 的子类型当且仅当它直接或间接地从它继承)通过指定所有三个的共同祖先(如果所有其他方法都失败,object)。当然我们需要递归——toString 的类型是什么?什么是类型(Integer | Double | BigInteger).+?!?这远非微不足道(事实上,寻找解决方案让我有点头疼)。我不能说这是否不可能,但没有任何主要面向对象语言的类型系统在任何地方都足够复杂以提供可能的解决方案。

底线是:如果有高手来解决它提出的问题,那就太酷了。可能不值得努力...

编辑:你知道代数数据类型吗?它们与您的想法相似(但要旧得多;)),因为代数数据类型由多种类型组成,因此可以包含例如 BigInteger、Double 和 Nil - 实际值是其中之一和标签(如标记的 union ) 说的是哪个。但是要使用存储在代数数据类型中的值,您必须使用模式匹配来安全地提取它。这个概念非常强大,并且仍然“简单”到足以被理解的工具——例如类型推断和静态类型检查工作。

于 2010-09-11T21:41:32.883 回答
1

是的,OCaml 以多态变体的形式提供这些:

type my_var = Integer of int | Float of float;;
let x = Integer(10);;
let y = Float(3.14);;
于 2010-09-12T00:16:43.007 回答
1

它与 OO 没有太大关系,但是(据我所知)您所描述的内容看起来很像 C++ 实现的多态性。

于 2010-09-11T21:23:44.457 回答
1

Pike和Magpie一样拥有它们,这是我正在研究的一种可选类型语言。Google 的Javascript闭包编译器|允许您使用.

它们经常出现在连接静态和动态类型的语言中,因为动态语言中的许多表达式可以产生以下几种类型之一:

var a = 123;
if (foo) { a = "string"; }
bar(a);

传递给的静态确定类型bar()Number | String.

于 2010-09-12T19:22:04.887 回答
0

我不太确定我们是否真的对什么是静态类型语言有完整的定义,但我也希望你描述的语言不符合标准。

我担心的一个问题是,如果您将类型 T1 和 T2 添加为您的一部分,BigInteger | Double | Nil它们将如何相互了解以及如何处理您定义的操作?现在我意识到您从未说过该语言将允许扩展“隐式”转换定义。

想一想,C# 在字符串处理中做了类似的事情

string s = -42 + '+' + "+" + -0.1 / -0.1 + "=" + (7 ^ 5) + 
  " is " + true + " and not " + AddressFamily.Unknown; 

=> "1+1=2 为真且不未知"

string str = 1 + 2 + "!=" + 1 + 2;

=>“3!=12”

我不喜欢它。

于 2010-09-11T21:28:06.330 回答