最初のメモ:
私が探していたものを正確に述べるための適切な用語が欠けていたため、この質問は数回の編集の後に閉じられました。その後、Sam Tobin-Hochstadtがコメントを投稿しました。これは、関数の戻り値の交差タイプをサポートするプログラミング言語を正確に認識させるものです。
質問が再び開かれたので、(できれば)より正確な方法で書き直すことで改善することにしました。したがって、以下の回答とコメントは以前の編集を参照しているため、意味をなさない場合があります。(そのような場合は質問の編集履歴をご覧ください。)
関数の戻り値の交差タイプをサポートする、静的で強く型付けされた一般的なプログラミング言語(Haskell、汎用Java、C#、F#など)はありますか?もしそうなら、どれ、そしてどのように?
(正直なところ、C#やJavaなどの主流言語で交差タイプを表現する方法を誰かがデモンストレーションするのを見てみたいです。)
C#に似た疑似コードを使用して、交差タイプがどのように見えるかの簡単な例を示します。
interface IX { … }
interface IY { … }
interface IB { … }
class A : IX, IY { … }
class B : IX, IY, IB { … }
T fn() where T : IX, IY
{
return … ? new A()
: new B();
}
つまり、関数fn
はあるタイプのインスタンスを返します。T
呼び出し側は、それがインターフェースIX
とを実装していることだけを知っていますIY
。(つまり、ジェネリックとは異なり、呼び出し側は具体的な型を選択することはできませんT
—関数はそうします。これからT
、実際にはユニバーサル型ではなく、実存型であると思います。)
PS:を単に定義しinterface IXY : IX, IY
、の戻り値の型をfn
に変更できることを知っていますIXY
。しかし、それは、実際には同じものではありませんので、多くの場合、あなたの追加インターフェイスのないボルトができIXY
、以前に定義された型にA
のみ実装IX
し、IY
個別に。
脚注:交差点の種類に関するリソース:
「タイプシステム」のウィキペディアの記事には、交差タイプに関するサブセクションがあります。
ベンジャミンC.ピアース(1991)のレポート、「交差点タイプ、ユニオンタイプ、およびポリモーフィズムを使用したプログラミング」
David P. Cunningham(2005)、「Intersection types in practice」、ウィキペディアの記事で言及されているForsythe言語に関する事例研究が含まれています。
スタックオーバーフローの質問、「ユニオンの種類と交差点の種類」にはいくつかの良い答えがありましたが、この質問では、上記のものと同様の交差点の種類の擬似コード例を示しています。
T
インターフェイスのI
すべてのメソッドを実装するときにインターフェイスとして型を扱うことを許可するが、そのインターフェイスを宣言しなかった言語」に変更します。
T
それは単に「/実装拡張し、いくつかのタイプとして、関数宣言内で定義されていた場合でも、型を定義IX
してのIY
」。事実、実際の戻り値はその特殊なケースである(A
またはB
それぞれ)は、あなただけのようにも使用してそれを実現でき、ここでは何も特別なものではありませんObject
代わりにT
。