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

gue*_*est 5 theory programming-languages language-theory language-design

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

var value: BigInteger | Double | Nil
Run Code Online (Sandbox Code Playgroud)

我想到了在这个对象上调用方法的方法.如果对象值的类型为BigInteger | 双语言可以让用户只能拨打共享方法(湖加,减),但是当该类型的BigInteger | 双| Nil然后Nil的对象没有方法加减,所以我们不能对这个对象做任何有用的事情,因为它只有很少的共享方法(比如toString).

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

Jör*_*tag 8

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

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

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


小智 5

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

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

最重要的是:如果出现了一些奇怪的事情并整理出它引发的问题,那真的很酷.可能不值得努力......

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

  • 我真的很喜欢这位选民解释原因,因为我喜欢这种推理. (3认同)

kri*_*iss 1

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