ポリモーフィズム ポリモーフィズムの種類

ポリモーフィズム

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/05 07:11 UTC 版)

ポリモーフィズムの種類

アドホック多相

関数や演算子の多重定義のように、同じ名前で型の異なる引数に適用できて、その振る舞いは引数の型によって違うような関数の多相性のことを「アドホック多相」という。「ad hoc(その場しのぎの)」という用語は悪い意味で使われているのではなく、単にこの種の多相性が型システムの基本的な機能ではないという事実を指して使われている。次のC++での例では、Add関数は呼び出し側からは様々な型に対して総称的に動作するかのように見えるが、コンパイラから見ればこれらは全く別個の2つの関数である。

#include <iostream>
#include <string>

int Add(int x, int y) {
    return x + y;
}

std::string Add(const std::string& s1, const std::string& s2) {
    return s1 + s2;
}

int main() {
    std::cout << Add(1, 2) << std::endl; // "3" が出力される。
    std::cout << Add("Hello, ", "World!") << std::endl; // "Hello, World!" が出力される。
}

動的型付け言語では、実行されるべき正しい関数が実行時まで決定できない可能性があるという点で、状況はより複雑になりうる。暗黙の型変換も型強制多相(coercion polymorphism)としてアドホック多相の一形態と定義される[3][5]

パラメトリック多相

パラメトリック多相を使うと、値の型に関係なく「一様に」値を扱うことで、関数やデータ型を総称的に記述できるようになる[6]。パラメトリック多相は言語の静的な型安全性を保ちながら表現力を向上させる手法のひとつである。

パラメトリック多相の概念は関数とデータ型の両方に適用される。異なる型の値に対して評価、適用可能な関数のことを「多相な関数」という。総称化された型とみなすことができるデータ型(例えば任意の型の要素を持てるリスト)は「多相なデータ型」という。

パラメトリック多相性は関数型プログラミングの分野では至るところに現れるため、しばしば単に「多相性」と言われることがある。次のHaskellの例ではパラメータ化されたリストと2つのパラメトリック多相な関数を示す。

data List a = Nil | Cons a (List a)

length :: List a -> Integer
length Nil         = 0
length (Cons x xs) = 1 + length xs

map :: (a -> b) -> List a -> List b
map f Nil         = Nil
map f (Cons x xs) = Cons (f x) (map f xs)

パラメトリック多相は様々なオブジェクト指向言語でも利用できる。例えばC++やD言語のテンプレート、JavaやC#のジェネリクスなどである。

class List<T> {
    class Node<T> {
        T elem;
        Node<T> next;
    }
    Node<T> head;
    int GetLength() { ... }
}

List<B> Map(Func<A, B> f, List<A> xs) {
    ...
}

ジャン=イヴ・ジラールJohn C. Reynolds英語版は、それぞれ独立に、パラメトリック多相の概念をラムダ計算の拡張(System Fや多相ラムダ計算と呼ばれる)として形式的に発展させた。

サブタイピング

いくつかのプログラミング言語では、特定の多相性の状況において使用できる型の範囲を制限するためにサブタイピングを採用している。サブタイピングを使用すると、ある型Tのオブジェクトを受け取る関数は、Tのサブタイプである型Sのオブジェクトを渡された場合でも正しく動作する(リスコフの置換原則)。この型の関係性はしばしばS <: Tと表記される。一般的にサブタイプ多相=インクルージョン多相は動的に解決される(後述)。

次のJavaの例ではAnimalのサブタイプとしてCatDogを用意する。メソッドletsHear()Animal型の引数を受け取るが、そのサブタイプの引数を渡しても問題なく動作する。

abstract class Animal {
    abstract String talk();
}

class Cat extends Animal {
    String talk() {
        return "Meow!";
    }
}

class Dog extends Animal {
    String talk() {
        return "Woof!";
    }
}

class Test {
    static void letsHear(final Animal a) {
        System.out.println(a.talk());
    }
    public static void main(String[] args) {
        letsHear(new Cat());
        letsHear(new Dog());
    }
}

オブジェクト指向言語は継承によってサブタイピングを提供する。典型的な実装では、各クラスはそれぞれ仮想関数テーブル(vtable)と呼ばれる関数のテーブルを持ち、各オブジェクトは自らのクラスのvtableへのポインタを持つ。多相なメソッドを呼び出すときには、このvtableを参照する。

多くのオブジェクト指向言語では、仮想関数の呼び出しに1番目の引数(thisオブジェクト)の vtable だけを参照する単一ディスパッチを採用している。つまりその他の引数の実行時の型は仮想関数の呼び出しに全く無関係である。一方でCommon Lispなどでは、メソッドの呼び出しが「全ての」引数に対して多相的となる多重ディスパッチを採用している。

ロー多相

ロー多相は、型理論におけるレコード型(record type)の直積的または総和的な可変長要素の構造分析から導き出された多態性であり、動的型付けおよび動的プログラミングを説明できる形式論理として紹介される。構造的型付け (structural typing) の多態性(多相性)はロー多相に分類されることがある[7]。構造的型付けに類似したダックタイピングの説明にも適している。

日本語では行多相[8]と訳されることもあれば、列多相[9]と訳されることもある。

ポリタイピズム

ポリタイピズムは、パラメトリック多相の亜流と言えるものである。パラメトリック多相での型が型変数を内包するという概念を、ポリタイピズムでは型が包装型を着脱するという概念に置き換えている。包装型=コンテナである。コンテナの着脱は圏論での関手に類似している。ポリタイピズムは、ジェネリックプログラミングを説明する多態性として扱われている。


  1. ^ polytypismは他の分野で「多型性」と邦訳されることがある。CiNii 論文 - 光の非視覚的作用と概日リズム : 生理的多型性へのアプローチ(<特集>生理人類学のキーワード"生理的多型性"の本質に迫る)
  2. ^ C. Strachey – Fundamental Concepts in Programming Languages http://www.itu.dk/courses/BPRD/E2009/fundamental-1967.pdf
  3. ^ a b Cardelli, Luca; Wegner, Peter (December 1985). “On understanding types, data abstraction, and polymorphism”. ACM Computing Surveys (New York, NY, USA: ACM) 17 (4): 471–523. doi:10.1145/6041.6042. ISSN 0360-0300. http://lucacardelli.name/Papers/OnUnderstanding.A4.pdf. 
  4. ^ ポリタイピックプログラミング(polytypic programming)はジェネリックプログラミングと同一視されることがある。Polytypic Programming in Haskell | SpringerLink
  5. ^ Allen B. Tucker (28 June 2004). Computer Science Handbook, Second Edition. Taylor & Francis. pp. 91–. ISBN 978-1-58488-360-9. https://books.google.com/books?id=9IFMCsQJyscC&pg=SA91-PA5 
  6. ^ Pierce, B. C. 2002 Types and Programming Languages. MIT Press.
  7. ^ Objects and Aspects: Row Polymorphism | Neel Krishnaswami, Department of Computer Science, Carnegie Mellon University
  8. ^ 実例によるPureScript
  9. ^ OCamlで構築するモダンWeb:型付きHTML5プログラミングの実際 | 有限会社ITプランニング | 今井 敬吾





英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「ポリモーフィズム」の関連用語

ポリモーフィズムのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



ポリモーフィズムのページの著作権
Weblio 辞書情報提供元は参加元一覧にて確認できます。

  
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのポリモーフィズム (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2022 GRAS Group, Inc.RSS