「型クラス」の版間の差分
削除された内容 追加された内容
編集の要約なし |
|||
1行目: | 1行目: | ||
([[計算機科学]]の)'''型クラス'''(Type class)は、{{仮リンク|アドホック多相|en|Ad hoc polymorphism}}をサポートする[[型システム]]の機能である<ref name="wadler88how">{{cite book|last1=Wadler|first1=P.|last2=Blott|first2=S.|chapter=How to make ad-hoc polymorphism less ad hoc|chapter-url=https://www.researchgate.net/publication/2710954|title=Proceedings of the 16th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages (POPL '89)|publisher=Association for Computing Machinery|date=1989|isbn=0897912942|pages=60–76|doi=10.1145/75277.75283|s2cid=15327197}}</ref>。{{仮リンク|型構築子|en|Type constructor}}などでの{{仮リンク|パラメトリック多相|en|Parametric polymorphism}}の{{仮リンク|型変数|en|Type variable}}に{{仮リンク|制約(mathematics)|en|Constraint (mathematics)|label=制約}}を付加して、[[多重定義|関数オーバーロード]]と演算子オーバーロードを実現するのが元々の目的になる<ref name="kaes88parametric">{{cite conference|first=Stefan|last=Kaes|title=Parametric overloading in polymorphic programming languages|book-title=Proc. 2nd European Symposium on Programming Languages|date=March 1988|doi=10.1007/3-540-19027-9_9|doi-access=free}}</ref>。 |
|||
{{出典の明記| date = 2020-5}} |
|||
{{型システム}} |
|||
'''型クラス'''(Type class)は、[[計算機科学]]において{{仮リンク|アドホック多相|en|Ad hoc polymorphism}}をサポートする[[型システム]]の構成機能である。純粋関数型言語[[Haskell]]での採用が有名であるが、他のパラダイムの言語でも様々に解釈されて導入されている。概念定義としては任意の型に{{仮リンク|制約(mathematics)|en|Constraint (mathematics)|label=制約}}を付加する仕組みであり、実装書式としては{{仮リンク|パラメトリック|en|Parametric polymorphism}}な{{仮リンク|型変数|en|Type variable}}をラッピングする{{仮リンク|型構築子|en|Type constructor}}に類似していて、それに[[ジェネリックプログラミング|ジェネリック関数]]群を関連付けている。 |
|||
典型的な型クラスは、型クラス<code>T</code>と型変数<code>a</code>を |
典型的な型クラスは、型クラス<code>T</code>と型変数<code>a</code>とその<code>a</code>を引数/返り値にした{{仮リンク|総称関数|en|Generic function}}の構成で宣言される。<code>a</code>に型<code>X</code>を当てはめたインスタンス化宣言で<code>X</code>は<code>T</code>で制約されて、その型<code>X</code>を引数/返り値にする[[関数 (プログラミング)|関数]]と[[演算子]]もインスタンス化される。総称関数も型<code>X</code>でインスタンス化される<ref>{{cite thesis|first=John G.|last=Morris|title=Type Classes and Instance Chains: A Relational Approach|date=2013|type=PhD|publisher=Department of Computer Science, Portland State University|doi=10.15760/etd.1010|url=https://jgbm.github.io/pubs/morris-dissertation.pdf}}</ref>。 |
||
型クラスは、[[Standard ML]]のeqtypesで提唱された後に、[[Haskell]]で初めて導入されている<ref name="appel91standard">{{cite book|last1=Appel|first1=A.W.|last2=MacQueen|first2=D.B.|chapter=Standard ML of New Jersey|chapter-url=|editor-last=Maluszyński|editor-first=J.|editor2-last=Wirsing|editor2-first=M.|title=Programming Language Implementation and Logic Programming. PLILP 1991|publisher=Springer|date=1991|isbn=3-540-54444-5|pages=1–13|doi=10.1007/3-540-54444-5_83|series=Lecture Notes in Computer Science|volume=528|citeseerx=10.1.1.55.9444}}</ref>。その主な目的は{{仮リンク|型注釈|en|Type signature}}などによる[[型システム]]の拡張的補正なしの[[多重定義|関数オーバーロード]]の実現である<ref name="kaes88parametric" />。これは{{仮リンク|純粋関数型|en|purely functional programming}}でのプログラムの[[形式的検証]]に必須になる。また、[[モナド (プログラミング)|モナド]]の実践も容易にする。 |
|||
型クラスの元々の目的は、{{仮リンク|暗黙的型付け|en|Type inference|label=型推論}}に専念している{{仮リンク|純粋関数型言語|en|purely functional programming}}において正当的に[[多重定義|関数オーバーロード]]を表現するための手段であり、関数の引数欄に型注釈を用いると純粋関数型の本質である[[形式的検証]]が成立しなくなることから、その代替案として考案されている。関数オーバーロードは、純粋でない[[関数型言語]]や[[命令型言語]]の方では、単に関数の引数欄に{{仮リンク|型注釈|en|Type signature}}を付記するだけで実装できることから、この元々の存在意義が分かりにくいものになっている。なお、型クラスの用法はそれに留まるものではなく、[[ジェネリックプログラミング|ジェネリック]]の[[ポリモーフィズム|型多相]](Polytypic)性質を活かしての[[圏論]]的な[[モナド (プログラミング)|モナド]]機構の実装など数々のテクニックにも応用されている。 |
|||
その他の言語では、アドホック多相を[[サブタイピング (計算機科学)|サブタイプ多相]]に置き換えて、[[インタフェース (抽象型)|インターフェース]]と[[ジェネリックプログラミング|ジェネリクス]]を融合したような機能にされていることが多い。それは[[レコード (計算機科学)|レコード]]や[[構造体]]や[[オブジェクト (プログラミング)|オブジェクト]]に実装されて、その振る舞いをカテゴライズする。 |
|||
== 脚注 == |
|||
⚫ | |||
[[Category:型理論]] |
[[Category:型理論]] |
||
[[Category:型システム]] |
[[Category:型システム]] |
||
[[Category:関数型プログラミング]] |
[[Category:関数型プログラミング]] |
||
⚫ |
2021年12月13日 (月) 03:39時点における版
(計算機科学の)型クラス(Type class)は、アドホック多相をサポートする型システムの機能である[1]。型構築子などでのパラメトリック多相の型変数に制約を付加して、関数オーバーロードと演算子オーバーロードを実現するのが元々の目的になる[2]。
典型的な型クラスは、型クラスT
と型変数a
とそのa
を引数/返り値にした総称関数の構成で宣言される。a
に型X
を当てはめたインスタンス化宣言でX
はT
で制約されて、その型X
を引数/返り値にする関数と演算子もインスタンス化される。総称関数も型X
でインスタンス化される[3]。
型クラスは、Standard MLのeqtypesで提唱された後に、Haskellで初めて導入されている[4]。その主な目的は型注釈などによる型システムの拡張的補正なしの関数オーバーロードの実現である[2]。これは純粋関数型でのプログラムの形式的検証に必須になる。また、モナドの実践も容易にする。
その他の言語では、アドホック多相をサブタイプ多相に置き換えて、インターフェースとジェネリクスを融合したような機能にされていることが多い。それはレコードや構造体やオブジェクトに実装されて、その振る舞いをカテゴライズする。
脚注
- ^ Wadler, P.; Blott, S. (1989). “How to make ad-hoc polymorphism less ad hoc”. Proceedings of the 16th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages (POPL '89). Association for Computing Machinery. pp. 60–76. doi:10.1145/75277.75283. ISBN 0897912942
- ^ a b Kaes, Stefan (March 1988). "Parametric overloading in polymorphic programming languages". Proc. 2nd European Symposium on Programming Languages. doi:10.1007/3-540-19027-9_9。
- ^ Morris, John G. (2013). Type Classes and Instance Chains: A Relational Approach (PDF) (PhD). Department of Computer Science, Portland State University. doi:10.15760/etd.1010。
- ^ Appel, A.W.; MacQueen, D.B. (1991). “Standard ML of New Jersey”. In Maluszyński, J.; Wirsing, M.. Programming Language Implementation and Logic Programming. PLILP 1991. Lecture Notes in Computer Science. 528. Springer. pp. 1–13. doi:10.1007/3-540-54444-5_83. ISBN 3-540-54444-5