多相
Poymorphism, poly = many = 多, morph = form = 相
多相性という言葉は、プログラムの一部分を、異なる文脈では異なる型として用いることを可能にする各種の言語機構を指す。
型システム入門 プログラミング言語と型の理論 p.260
プログラミング言語の型システムの性質を表す。プログラミング言語の各要素(変数、定数、式、オブジェクト、関数、メソッド)が、複数の型に属することを許す性質。
歴史
1967年:
多相の分類は、クリストファーストレイチーが、講義ノート Fundamental Concepts in Programming Languages の中で導入した
アドホック多相, パラメータ多相
1985年:
Peter Wegner, Luca Cardelli によって発表された論文の中で拡張された。
包含多相
多相の種類
アドホック多相
多相的な値が異なる型として見られる 時、異なったように振舞う
オーバーロードがわかりやすい例で、1つの関数名に異なる実装を割り当てることができる
関数適用毎に、引数の型に基づいて、コンパイラが適切な実装を選ぶ
パラメータ多相
変数を使って、総称的に 型づけできる
パラメータ化された定義は 一様 であり、具象は全て同じ振る舞いをする
サブタイプ (部分型) 多相
TODO...
アドホック多相 (Ad hoc Polymorphism)
関連性のない型の引数にも適用できる、 多相的な関数 のこと。引数の型に応じて、アドホックに実装にディスパッチされる。
オーバーロードで実現できる。オーバーロードを使用すると、引数の数や型に応じてメソッドのシグネチャが静的に決まる
ただし、型が解決されないままアドホックに実装をディスパッチするのではなく、静的にコンパイラが解決する
型クラスで実現できる
引数の型に応じて、個別の実装にディスパッチされる
Haskell では型同士に階層関係はない(たぶん)ので、ある型が型クラスを実装するかどうかはアドホックに決められる
オーバーロード
implicit parameter
implicit キーワードが付加された値やオブジェクトを引数として受け取れるアドホックな多相性を実現できる
アドホック多相。型クラスを使う。
型それ自体のソースにアクセスしなくとも拡張が行える。
異なる型に対して別の関数定義を提供できる。
サブタイプ多相 (Subtype Polymorphism)
抽象クラスとサブクラスとオーバーライド
継承を使った多相の問題点。
データ型の定義時に同時に実装も行わなければならない。
パラメトリック多相 (Parametric Polymorphism)
型に関係なく、値を均一に扱うことで、関数やデータ型を相性的に記述できるようにする。
型安全性を保ちながら表現力を向上させることができる。
Java などでいう総称型(ジェネリクス)
論文読んだ
ad-hoc
関数が、異なる型に対して定義されていて、型ごとにことなる振る舞いをする
例) 演算子のオーバーロード。異なる型(Int, Float, ...) に対しても同様に実行できる
Parametric polymorphism
関数が、ある範囲内の型に対して定義されていて、どの型に対しても同様の振る舞いをする
例) lengthメソッド。List[Int] に対しても List[Float] に対しても同様の振る舞いをする
参考