5

私はプログラミング理論について読むのが好きなので、変数がいくつかの型を持つことを可能にするオブジェクト指向の静的型付き言語があれば教えていただけますか? 疑似コードの例:

var value: BigInteger | Double | Nil

このオブジェクトのメソッドを呼び出す方法を考えます。オブジェクトの型がBigInteger |の場合 二重言語を使用すると、ユーザーは共有メソッド (レイク プラス、マイナス) のみを呼び出すことができますが、型がBigInteger | ダブル | Nilの場合、Nil のオブジェクトにはプラスとマイナスのメソッドがないため、共有メソッド (toString など) がほとんどないため、このオブジェクトでは何も役に立ちません。

では、静的型付きオブジェクト指向言語で型の少ない変数に対してメソッドを呼び出す方法はありますか?

4

6 に答える 6

8

あなたが説明しているのは交差点タイプです。たとえば、それらはJava に存在しますが、キャプチャ変換と型推論の結果として型チェッカー内でのみ発生します。自分で書くことはできません。

それらを直接使用する言語は知りませんが、言語の型システム、特に実際には型システムを持たない言語を記述または分析するためによく使用されます。たとえば、Diamondback Ruby は静的型システムであり、動的に型付けされた Ruby プログラミング言語の型推論器であり、共用体型と交差型の両方を使用します。

使用している構文は、通常、交差タイプの双対である共用体タイプを示すために使用されることに注意してください。交差点の種類は一般的に書かれてA & B & Cいます。

于 2010-09-12T00:03:09.227 に答える
5

私はこれを行う言語を認識していません...悲しいことに、私はそれをいじってみたいと思っています(しかし、最初に、型推論とパラメトリックポリモーフィズムを採用する必要があります;))。

可能ですが: 構造型システム (型 a が b のすべてを持っている場合、型 a は型 bのサブタイプです) では比較的エレガントBigIntegerに3つすべての共通の祖先を指定することにより(他のすべてが失敗した場合、 )、主格型システム(型 a が型 b から直接または間接的に継承する場合にのみ、型 a は型 b のサブタイプです)。もちろん、再帰的にする必要があります - toString の型は何ですか? そして、その典型は何ですか?!? これは些細なことではありません (実際、解決策を探すのに少し頭が痛くなりました)。それが不可能かどうかはわかりませんが、主にオブジェクト指向言語の型システムは、解決策として十分に洗練されたものではありません。DoubleNilobject(Integer | Double | BigInteger).+

要点は次のとおりです。何人かの天才が現れて、それが提起する問題を整理してくれたら、本当に素晴らしいことです。おそらく、努力する価値はありません...

編集:代数データ型を知っていますか?代数データ型はいくつかの型で構成されているため、BigInteger、Double、および Nil などを含めることができるという点で、それらはあなたの考えに似ています (ただし、はるかに古い ;))。実際の値はこれらのいずれかとタグです (タグ付けされたユニオン)はどちらを言います。ただし、代数データ型に格納された値を使用するには、パターン マッチングを使用して安全に抽出する必要があります。この概念は非常に強力であり、型推論や静的型チェックなどのツールとして理解できるほど「単純」です。

于 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

私が取り組んでいるオプションで型指定された言語であるMagpieと同様に、 Pikeにはそれらがあります。Javascript 用の Google のClosure コンパイラを使用すると、Javascript で型に注釈を付けることができます|

静的型付けと動的型付けを橋渡しする言語では、動的言語の多くの式がいくつかの型のいずれかを生成できるため、頻繁に発生します。

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

に渡される静的に決定された型bar()は ですNumber | String

于 2010-09-12T19:22:04.887 に答える
1

OOとはあまり関係ありませんが、(私が理解している限り)C++で実装されているポリモーフィズムによく似ています。

于 2010-09-11T21:23:44.457 に答える
0

静的型付き言語とは何かについて本当に完全な定義があるかどうかはよくわかりませんが、あなたが説明する言語が静的型付き言語と見なされないことを願っています.

私の懸念の 1 つは、型 T1 と T2 を の一部として追加した場合、BigInteger | Double | Nilそれらはどのようにして互いを認識し、定義した操作をどのように処理するのかということです。言語が「暗黙の」変換定義を拡張できるとは決して言わなかったことに気づきました。

そういえば、C# の文字列処理はこれに似ていますね。

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

=> 「1+1=2 は True であり、Unknown ではありません」

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

=>「3!=12」

そして、私はそれが好きではありません。

于 2010-09-11T21:28:06.330 に答える