是否有任何面向对象的静态类型语言,其中包含少量类型的变量?

时间:2010-09-11 21:16:02

标签: programming-languages language-design theory language-theory

我喜欢阅读有关编程理论的内容,所以你能告诉我是否有任何面向对象的静态类型语言允许变量有几种类型? pesudocode中的示例:

var value: BigInteger | Double | Nil

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

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

6 个答案:

答案 0 :(得分:8)

您所描述的是intersection type。例如,它们执行exist in Java,但它们仅在类型检查器中出现,作为捕获转换和类型推断的结果。你不能自己写一个。

我不知道任何直接使用它们的语言,但它们通常用于描述分析类型的语言系统,特别是那些没有语言的语言实际上拥有类型系统。例如,Diamondback Ruby是动态类型的Ruby编程语言的静态类型系统和类型推理器,它使用union和intersection类型。

请注意,您使用的语法通常用于表示 union types ,它们是交集类型的对偶。交叉点类型通常写为A & B & C

答案 1 :(得分:5)

我不知道有任何语言可以做到这一点......遗憾的是,我喜欢玩它(但首先,他们应该采用类型推断和参数多态;)。

尽管它是不可能的:在结构类型系统中相对优雅(类型a是类型b的子类型,如果a具有b具有的所有内容),只需指定值的类型即BigInteger的结构子类型和Double以及Nil并且在主格类型系统中稍微不那么优雅(类型a是b类型的子类型,当且仅当它直接或间接地从它继承时)通过指定共同的祖先在所有这三个中(如果所有其他方法都失败了,object)。当然我们需要递归 - toString的类型是什么?什么是(Integer | Double | BigInteger).+的典型?!?这远非微不足道(事实上,寻找解决方案让我头疼一点)。我不能说这是否是不可能的,但主要不是OO语言的类型系统在任何可能的解决方案都足够复杂。

最重要的是:如果出现了一些奇怪的事情并且解决了它引发的问题,那将是非常酷的。可能不值得努力...

编辑:你知道algebraic data types吗?它们类似于你的想法(但更老;))因为代数数据类型由几种类型组成,因此可以包含例如一个BigInteger,一个Double和Nil - 实际值是其中之一,一个标签(如tagged union中所述)说明哪个。但是要使用存储在代数数据类型中的值,您必须使用pattern matching来安全地提取它。 这个概念非常强大,并且仍然“简单”足以被理解为工具 - 例如类型推理和静态类型检查工作。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

type my_var = Integer of int | Float of float;;
let x = Integer(10);;
let y = Float(3.14);;

答案 4 :(得分:1)

PikeMagpie一样,是我正在使用的可选类型语言。 Google的Closure compiler for Javascript允许您使用|在Javascript中注释类型。

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

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

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

答案 5 :(得分:0)

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

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

想想看,C#在其string handling

中做了类似于此的事情
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”

我不喜欢它。