「型クラス」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Sycgln (会話 | 投稿記録)
Poshnegev (会話 | 投稿記録)
編集の要約なし
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>a</code>は<code>T</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)性質を活かしての[[圏論]]的な[[モナド (プログラミング)|モナド]]機構の実装など数々のテクニックにも応用されている。


[[Haskell]]以外の言語の導入では、アドホック多相を{{仮リ|サブタイプ多相|en|Subtyping}}に置き換えたり、[[ジェネリックプログラミング|ジェネリク]]を[[テンプレートメタプログラミング]]置き換えるなどしている。[[インタフェ (抽象型)|インタフェース]]の実装による[[構造体]]や[[オブジェクト (プログラミング)|オブジェクト]]の振る舞いグループ化と、型変数による[[関数 (プログミング)|関数]]や[[メソッド (計算機科学)|メソッド]]の汎用化を融合させた機能とされていことが多い
その他の言語では、アドホック多相を[[サブタイピグ (計算機科学)|サブタイプ多相]]に置き換え[[インタフェース (抽象型)|インターフェース]]と[[ジェネリックプログラミング|ジェネリク]]を融合したような機能されていることが多いそれは[[レコ (計算機科学)|レコ]][[構造体]]や[[オブジェクト (プログラミング)|オブジェクト]]に実装されて、その振る舞いをカテゴイズする。


== 脚注 ==
{{Computer-stub}}
[[Category:型理論]]
[[Category:型理論]]
[[Category:型システム]]
[[Category:型システム]]
[[Category:関数型プログラミング]]
[[Category:関数型プログラミング]]
<references />{{Computer-stub}}

2021年12月13日 (月) 03:39時点における版

計算機科学の)型クラス(Type class)は、アドホック多相英語版をサポートする型システムの機能である[1]型構築子英語版などでのパラメトリック多相英語版型変数英語版制約英語版を付加して、関数オーバーロードと演算子オーバーロードを実現するのが元々の目的になる[2]

典型的な型クラスは、型クラスTと型変数aとそのaを引数/返り値にした総称関数英語版の構成で宣言される。aに型Xを当てはめたインスタンス化宣言でXTで制約されて、その型Xを引数/返り値にする関数演算子もインスタンス化される。総称関数も型Xでインスタンス化される[3]

型クラスは、Standard MLのeqtypesで提唱された後に、Haskellで初めて導入されている[4]。その主な目的は型注釈英語版などによる型システムの拡張的補正なしの関数オーバーロードの実現である[2]。これは純粋関数型英語版でのプログラムの形式的検証に必須になる。また、モナドの実践も容易にする。

その他の言語では、アドホック多相をサブタイプ多相に置き換えて、インターフェースジェネリクスを融合したような機能にされていることが多い。それはレコード構造体オブジェクトに実装されて、その振る舞いをカテゴライズする。

脚注

  1. ^ 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. https://www.researchgate.net/publication/2710954 
  2. ^ 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
  3. ^ 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
  4. ^ 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