株式会社G・B・S株式会社G・B・S技術ブログを開設しました。2019/10/30こんにちは。GBS第2システム開発部の小路です。関数型プログラミングの手助けをするKotlin製のライブラリにArrowというものがありますが、それを使うためには、基本的な用語を知っている必要があります。今回は主にArrowに記載の内容を元に、型コンストラクタと高カインド型の概要をまとめます。ListK<A>、Option<A>(※1)のAがジェネリックパラメータに相当)ListK<A>のAに対して、Int型を割り当てた場合、ListKはListK<Int>となる。このとき、ListKにはジェネリックパラメータではなく、Intと言う具体的な型が指定されているため、型コンストラクタとは見なされなくなり、通常の「型」と見なされるようになる。R>)の一つのパラメータに対して型を適用した場合、その結果まだもう一方のジェネリックパラメータが残っているので、これは型コンストラクタと見なされる。R>となるが、これはRというジェネリックパラメータを持っているので、型コンストラクタと見なされる。A>というインタフェースを利用して、それを表現している。OptionのいずれもArrowが提供するAPI。ListKはKotlin標準のListクラスをラップして、モナド則を満たす関数を提供する。Arrowにおける高カインド型とはカインドをざっくり言い表すと、「型コンストラクタ」の「型」のことである。n階の型コンストラクタは、型パラメータに具体型を適用することで普通型となる。ListK<A>は1階の型コンストラクタだが、このAに対して、Int型を割り当てた場合、ListK<Int>となり、普通型となる。A>というインタフェースで表現され、Fはコンテンツをラップするコンテナの型を表し、Aはコンテンツの型を表す。3階以降の表現方法も同様。A>のFを表現するための代理クラスがあり、その代理クラス名はコンテナのクラス名に対して接頭辞「For」を付与したものである。(例:ForListK、ForOption)具体的に、OptionクラスとForOptionクラスの関係性は以下のようになります。A>を実装するクラスとして定義されており、以下を満たすことが読み取れます。A>はコンテンツの型として、A(ジェネリックパラメータ)をもつ。A>はコンテナの型(コンテンツをラップする役割を持つ型)としてForOptionをもつ。*(「1階の型コンストラクタ」)で表現できる。-を適用すると、Option<Int>となり、型コンストラクタではなく具体的な型(カインドは「*」)となる。A>を実装するのはOption<A>のみであるため、ForOptionとOption<A>は密接な結びつきを持つ。A>からOptionへ安全にダウンキャストができる。A>のFに対して、Arrowで提供される全てのDatatypes(OptionやListK、Eitherなど)に適用できる、fixという関数が実装されています。これにより、KindクラスからOptionやEitherなどのサブクラスにダウンキャストができるようになっています。A>のFにForOptionが適用されたfix関数は以下の通りです。etcも同様)であるため、ダウンキャストが安全に行えるようになっています。受注開発G・B・Sのニュース、採用情報、イベントなどについての記事を書いてます。社内のイベントもSNSをメインに発信して行きます。興味のある方は是非そちらにも目を通して見てください。