ポリモーフィズム


ポリモーフィズム: polymorphism)とは、それぞれ異なる型に一元アクセスできる共通接点の提供[1]、またはそれぞれ異なる型の多重定義を一括表現できる共通記号の提供[2]を目的にした、型理論またはプログラミング言語理論英語版の概念および実装である。この用語は、有機組織および生物の種は様々な形態と段階を持つという生物学の概念からの借用語である[3]多態性多相性と邦訳されることが多い。

ポリモーフィズムは、通常以下の三種に分けられる。

アドホック多相
(ad hoc polymorphism)
恣意的な型の集合に一つの共通接点を提供する。関数オーバーロードMix-inのいち実装、型クラスなど。
パラメトリック多相
(parametric polymorphism)
詳細化されていない型要素を内包する抽象的な型に記号表現を提供する。ジェネリクス関数型言語の型構築子など。
サブタイピング
(subtyping)
サブタイプ多相(subtype polymorphism)やインクルージョン多相(inclusion polymorphism)とも。上位型をその下位型の数々で代替できるようにする[4]オブジェクト指向の多態性はこれを指す。

この他に、ロー多相英語版(row polymorphism)とポリタイピズム(polytypism)[注釈 1]も挙げられることがある。対義語はモノモーフィズム(Monomorphism)である。

歴史

ポリモーフィックな型システムの研究は1960年代から始められている。クリストファー・ストレイチーの1967年論文Fundamental Concepts in Programming Languages英語版で、アドホック多相とパラメトリック多相という概念が初めて提唱されている[6]。アドホック多相は「ALGOL68」で実践され、パラメトリック多相は「ML」の型システムで実践された。 1985年にピーター・ウェグナー英語版ルカ・カーデリ英語版は「Simula67」の継承+動的ディスパッチを説明するためのインクルージョン多相という概念を提唱した[7]。これとストレイチー提唱の二つを合わせて三本柱にした概念が、ポリモーフィズムと呼ばれるようになっている。

1989年にオブジェクト指向動的型付けを説明するためのロー多相英語版という概念がミッチェル・ワンド英語版の著作で提唱されているが、知名度は低い。同年にパラメトリック多相をモチーフにしたジェネリックプログラミングアレクサンダー・ステパノフ英語版らの著作で提唱され、これはポリタイピズムとも呼ばれた[注釈 2]

1980年代の「Ada」はジェネリクスに型制約と称する有界量化英語版の概念を採用した。1990年代の「Haskell」はアドホック多相とジェネリクスを融合した型クラスを考案している。2003年の「Scala」はサブタイピングジェネリクス共変性と反変性を導入した。

ポリモーフィズムの種類

アドホック多相

関数や演算子の多重定義のように、同じ名前で型の異なる引数に適用できて、その振る舞いは引数の型によって違うような関数の多相性のことを「アドホック多相」という。「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)としてアドホック多相の一形態と定義される[7][8]

パラメトリック多相

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

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

パラメトリック多相性は関数型プログラミングの分野では至るところに現れるため、しばしば単に「多相性」と言われることがある。次の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) の多態性(多相性)はロー多相に分類されることがある[10]。構造的型付けに類似したダックタイピングの説明にも適している。

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

ポリタイピズム

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

ポリモーフィズムの実装的側面

静的な多態性と動的な多態性

ポリモーフィズムは実装がいつ選択されるかによって、静的(コンパイル時)か動的(実行時)かに区別できる。これはそれぞれ静的ディスパッチおよび動的ディスパッチとして知られ、さらにこれらに対応するポリモーフィズムはそれぞれ静的ポリモーフィズムおよび動的ポリモーフィズムと呼ばれる。後者は典型的には仮想関数などを通して実現される。

動的ディスパッチのオーバーヘッドが無いため、静的ポリモーフィズムはより高速に実行できるが、追加的なコンパイラの補助を必要とする。静的ポリモーフィズムではコンパイラやソースコード解析ツール、プログラマの目視による、より広範な静的解析(特に最適化)が可能となる。動的ポリモーフィズムはより柔軟だが速度はより遅くなる。例えば動的ディスパッチではダック・タイピングが可能で、動的にリンクされたライブラリはオブジェクトの型を知らなくても動作できるだろう。

典型的にはアドホック多相とパラメトリック多相は静的ポリモーフィズムとして動作し、サブタイプ多相は動的ポリモーフィズムとして動作する。しかし、奇妙に再帰したテンプレートパターンのような洗練されたテンプレートメタプログラミングを通して、サブタイプ多相で静的ポリモーフィズムを実現することも可能である。

単態性と多態性

ポリモーフィズムの対義語としてモノモーフィズム(monomorphism、単態性、単相性)という言葉が使われることがある。

モノモーフィックな型システムを持つプログラミング言語では、サブルーチン(言語によっては関数や手続きとも呼ばれる)はそれぞれ一意に識別される名前(識別子)と結びついており、従って異なる動作を実現するためには異なる名前を用いる必要があった。

例えば、何かの値を文字列形式に変換する最も単純な場合を考える。モノモーフィックな型システムを持つ言語では、次のように別々の関数になっていなければならない。

古典的な変換関数:
数値を文字列にする場合
string = StringFromNumber(number)
日付値を文字列にする場合
string = StringFromDate(date)

一方ポリモーフィックな型システムを持つ言語では、StringValue のような汎用の述語を定義し、型別にそれぞれ適切な変換方式を定義させることでオブジェクトの種別によらない抽象度の高い変換形式を実現できる。

多態的な変換方式:
見た目上、型によらない変換が可能
string = number.StringValue
string = date.StringValue

関数オーバーロードをサポートする言語では、共通の名前を持ち、引数の型だけが異なる StringFrom のような関数を定義することもできる。

string = StringFrom(number)
string = StringFrom(date)

無論、StringValueやStringFromの定義は型ごとに行なわなければならないので、総体として記述量が減少するとは限らない継承やジェネリックプログラミングによるコードの再利用はありうる)。また、何をもって「正しい動作」とするのかはオブジェクトの設計に依存するため、多態を使いこなすにはシステム全体を見通す設計能力が要求される。

注釈

  1. ^ polytypismは他の分野で「多型性」と邦訳されることがある[5]
  2. ^ ポリタイピックプログラミング(polytypic programming)はジェネリックプログラミングと同一視されることがある。Polytypic Programming in Haskell | SpringerLink

出典

  1. ^ Bjarne Stroustrup (February 19, 2007). “Bjarne Stroustrup's C++ Glossary”. 2017年3月8日閲覧。 “polymorphism – providing a single interface to entities of different types.”
  2. ^ Cardelli, Luca; Wegner, Peter (December 1985). “On understanding types, data abstraction, and polymorphism”. ACM Computing Surveys 17 (4): 471–523. doi:10.1145/6041.6042. http://lucacardelli.name/Papers/OnUnderstanding.A4.pdf. : "Polymorphic types are types whose operations are applicable to values of more than one type."
  3. ^ Polymorphism”. The Java™ Tutorials: Learning the Java Language: Interfaces and Inheritance. Oracle. 2021年9月8日閲覧。
  4. ^ Conallen, J.; Engle, M.; Houston, K.; Maksimchuk, R.; Young, B.; Booch, G. (2007). Object-Oriented Analysis and Design with Applications (3rd ed.). Pearson Education. ISBN 9780132797443 
  5. ^ 重和, 樋口「光の非視覚的作用と概日リズム : 生理的多型性へのアプローチ(生理人類学のキーワード"生理的多型性"の本質に迫る)」『日本生理人類学会誌』第18巻第1号、2013年、39–43頁、doi:10.20718/jjpa.18.1_39 
  6. ^ C. Strachey – Fundamental Concepts in Programming Languages http://www.itu.dk/courses/BPRD/E2009/fundamental-1967.pdf
  7. ^ 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. 
  8. ^ 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 
  9. ^ Pierce, B. C. 2002 Types and Programming Languages. MIT Press.
  10. ^ Objects and Aspects: Row Polymorphism | Neel Krishnaswami, Department of Computer Science, Carnegie Mellon University
  11. ^ 実例によるPureScript
  12. ^ OCamlで構築するモダンWeb:型付きHTML5プログラミングの実際 | 有限会社ITプランニング | 今井 敬吾

関連項目

Read other articles:

Ralf WaldmannKebangsaanGermanLahir(1966-07-14)14 Juli 1966Hagen, Jerman BaratMeninggal10 Maret 2018(2018-03-10) (umur 51)Ennepetal, Jerman Catatan statistik Karier Grand Prix Sepeda MotorTahun aktif1986 - 2000, 2002, 2009 Lomba pertamaGrand Prix Baden-Württemberg 80cc 1986Menang pertamaGrand Prix Jerman Barat 125cc 1991Menang terakhirGrand Prix Inggris 250cc 2000Lomba terakhirGrand Prix Inggris 250cc 2009TimHonda, Modenas, Aprilia Start Menang Podium Pole F. lap Poin 169 20 50 10 16 166...

 

Jérémie Boga Boga bermain untuk Rennes pada 2015Informasi pribadiNama lengkap Jérémie Boga[1]Tanggal lahir 3 Januari 1997 (umur 27)[2]Tempat lahir Marseille, PrancisTinggi 172 cm (5 ft 8 in)[2]Posisi bermain GelandangInformasi klubKlub saat ini Atalanta(dipinjam dari Sassuolo)Nomor 10Karier junior2003–2009 ASPTT Marseille2009–2015 ChelseaKarier senior*Tahun Tim Tampil (Gol)2015–2018 Chelsea 1 (0)2015–2016 → Rennes (pinjaman) 27 (2)201...

 

Mazmur 121Naskah Gulungan Mazmur 11Q5 di antara Naskah Laut Mati memuat salinan sejumlah besar mazmur Alkitab yang diperkirakan dibuat pada abad ke-2 SM.KitabKitab MazmurKategoriKetuvimBagian Alkitab KristenPerjanjian LamaUrutan dalamKitab Kristen19← Mazmur 120 Mazmur 122 → Mazmur 121 (disingkat Maz 121 atau Mz 121; penomoran Septuaginta: Mazmur 120) adalah sebuah mazmur dalam bagian ke-5 Kitab Mazmur di Alkitab Ibrani dan Perjanjian Lama dalam Alkitab Kristen. Tidak ada catatan n...

André Brasil Nazionalità  Brasile Nuoto Specialità 100 m stile libero200 m farfalla Palmarès  Paralimpiadi Oro Pechino 2008 50 m Stile libero S10 Oro Pechino 2008 100 m Stile libero S10 Oro Pechino 2008 400 m Stile libero S10 Oro Pechino 2008 100 m Farfalla S10 Argento Pechino 2008 200 m Misti S10   Modifica dati su Wikidata · Manuale André Brasil Esteves (23 maggio 1984) è un nuotatore brasiliano. Ha vinto l'oro per il Brasile ai XIII Giochi paralimpici estivi, ol...

 

Law enforcement agency in Yugoslavia Militia of SFR YugoslaviaMilicija SFR Jugoslavije / Милиција СФР ЈугославијеCommon nameSerbo-Croatian: Milicija / МилицијаAgency overviewFormed1944Preceding agencyPeople's Defence Corps of Yugoslavia (KNOJ)Dissolved1992Jurisdictional structureNational agencySFR YugoslaviaOperations jurisdictionSFR YugoslaviaLocation map of SFR YugoslaviaSize255,804 km2 (98,766 sq mi)Population23,229,846 (1991 estimate)General natureCivili...

 

Acquasantiera barocca nella chiesa di Santa Maria Maddalena (Roma) L'acquasantiera è un recipiente atto a contenere l'acqua santa. Si trova generalmente all'ingresso delle chiese ad uso dei fedeli.[1] Indice 1 Descrizione 2 Galleria d'immagini 3 Note 4 Bibliografia 5 Altri progetti 6 Collegamenti esterni Descrizione L'acquasantiera può essere fissata al muro (es. acquasantiera a labbro) o isolata, appoggiata su un sostegno (una colonna, un pilastro o un piedistallo), nel cui cas...

Professional wrestling stable This article is about the professional wrestling stable. For the Irish band, see The Corrs. Professional wrestling stable The CorreStableMembersWade BarrettJustin GabrielHeath SlaterEzekiel JacksonDebutJanuary 14, 2011DisbandedJune 10, 2011Years active2011 The Corre[1] was a short-lived villainous stable in WWE.[2] Formed in 2011, the group was a spinoff of Wade Barrett's former group The Nexus.[2] The stable was formed after Barrett left ...

 

Interstate 10/U.S. Route 90 - Interstate 45 interchange northwest of downtown Houston. This is a list of highways in the Houston–The Woodlands-Sugar Land metropolitan area. Freeways Present Designation Common Name Year of First Freeway Section[1] Maximum width: mainlanes (HOV)[2] Maximum Traffic Count, 2001 (AADT)[3] Maximum Traffic Count, 2009 (AADT)[4] Maximum Traffic Count, 2012 (AADT)[4] I-10 Baytown-East Freeway 1953 10 225,640 195,000 168,000 K...

 

Human-directed process of selective horse breeding This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Horse breeding – news · newspapers · books · scholar · JSTOR (June 2013) (Learn how and when to remove this message) Horse breeding is reproduction in horses, and particularly the human-directed process of sele...

Mahmud Lamako Latjuba BiografiKelahiran2 Mei 1909 Tojo Una Una Kematian7 Desember 1975 (66 tahun)Jakarta Duta Besar Indonesia untuk Mesir Agustus 1956 – Februari 1959 ← Tamsil (diplomat) – Sanusi Hardjadinata → Duta Besar Indonesia untuk Iran Mei 1953 – Agustus 1956 ← Rasjidi KegiatanPekerjaanpolitikus KeluargaAnakAzzizurrahman Latjuba Mahmud Lamako Latjuba (2 Mei 1909 – 7 Desember 1975) adalah seorang politikus Indonesia kelahi...

 

Було запропоновано приєднати статтю Українське телевізійне кіно до цієї статті або розділу, але, можливо, це варто додатково обговорити. Пропозиція з вересня 2020. Суспільне — український суспільний мовник Телебачення в Україні, як професійне мовлення, з'явилося 1951 ро�...

 

El rescate Autor John Everett MillaisCreación 1855Ubicación Galería Nacional de Victoria (Australia)Material Óleo y LienzoDimensiones 121,5 centímetros x 83,6 centímetros[editar datos en Wikidata] El rescate (1855) es una pintura de John Everett Millais que representa a un bombero rescatando a tres niños de un incendio en una casa, y su madre los recibe de nuevo en sus brazos. Millais fue testigo de la muerte de un bombero en el curso de un rescate y decidió representar el t...

Irwan Nasir Bupati Kepulauan Meranti ke-1Masa jabatan17 Februari 2016 – 17 Februari 2021PresidenJoko WidodoGubernurArsyadjuliandi RachmanWan Thamrin HasyimSyamsuarWakilSaid HasyimPendahuluEdy Kusdarwanto (Pj.)PenggantiPetahanaPenggantiKamsol (Plh.) Muhammad AdilMasa jabatan30 Juli 2010 – 30 Juli 2015PresidenSusilo Bambang YudhoyonoJoko WidodoGubernurRusli ZainalMambang Mit (Plt.)Djohermansyah Djohan (Pjs.)Annas MaamunArsyadjuliandi RachmanWakilMasrul KasmyPendahuluSy...

 

أستون أبتس   الإحداثيات 51°52′23″N 0°46′13″W / 51.872952777778°N 0.77017222222222°W / 51.872952777778; -0.77017222222222   [1] تقسيم إداري  البلد المملكة المتحدة[2]  التقسيم الأعلى باكينغهامشير  [لغات أخرى]‏  معلومات أخرى HP22  رمز الهاتف 01296  رمز جيونيمز 7290777،  و115930...

 

Bakeries of the United States This article is about the company known as Hostess Brands from 2009 to 2013. For the company which acquired the Hostess name from Old HB, see Hostess Brands. Old HB, Inc.Company typePrivateIndustryFood (bakery)Founded1930; 94 years ago (1930)DefunctNovember 21, 2012; 11 years ago (2012-11-21)FateBankruptcySuccessorHostess BrandsHeadquartersIrving, Texas, United StatesKey peopleGregory F. Rayburn, CEOProductsBrands such as Wonde...

American software company Not to be confused with the Amiga-focused software company Hyperion Entertainment or the Hyperion computer. Hyperion Solutions CorporationHeadquarters in Santa Clara, CaliforniaTraded as(Nasdaq: HYSL)IndustrySoftwareFounded1981Defunct2006FateAcquired by Oracle CorporationHeadquartersSanta Clara, California, United StatesKey peopleGodfrey R. Sullivan(President and CEO)ProductsBusiness intelligence toolsBusiness performance management tools Hyperion Solutions Corp...

 

ابن عبد الحكم معلومات شخصية الميلاد 800مصر تاريخ الوفاة 871 مواطنة الدولة العباسية  الأب عبد الله بن عبد الحكم إخوة وأخوات محمد بن عبد الله بن عبد الحكم  الحياة العملية المهنة مؤرخ  اللغات العربية  مجال العمل تاريخ  أعمال بارزة فتوح مصر والمغرب  [لغات أخرى]R...

 

French mathematician (1932–2024) Pierre CartierCartier in 2009BornPierre Émile Cartier(1932-06-10)10 June 1932Sedan, FranceDied17 August 2024(2024-08-17) (aged 92)Marcoussis, FranceEducationLycée Saint-LouisAlma materÉcole normale supérieureUniversity of ParisKnown forCartier divisorCartier dualityCartier isomorphismCartier operatorCartier's theoremCartier–Foata matricesTracesAwardsPrix Peccot (1960)[1]ICM Speaker (1970)Prize Ampère (1978)Scientific careerField...

Beastly BoyzDitulis olehDavid GroveSutradaraDavid DecoteauPemeranSebastian GackiEmery WrightKyle SchwitekDean HrycanValerie MurphyTyler BurrowsNeil William HrabowyAndrew ButlerCharlie MarshBahasa asliInggrisProduksiProduserDavid Decoteau(produser)Durasi96 minutesRilis asliRilis2006 (2006)[1] Beastly Boyz adalah film horor televisi Amerika Serikat-Kanada tahun 2006 yang disutradarai oleh David DeCoteau.[1][2] Film ini merupakan film pertama yang dirilis dibawah la...

 

الحزب الشيوعي اليوناني     البلد اليونان  تاريخ التأسيس 4 نوفمبر 1918  قائد الحزب ديميتريس كوتسومباس  [لغات أخرى]‏ (14 أبريل 2013–)  الأمين العام نيقوس زخريادس،  ونيقوس زخريادس،  وديميتريس كوتسومباس  [لغات أخرى]‏  المقر الرئيسي أثينا  الأيدي...