対象が一つの圏つぎは、対象のカインドが*ではないような圏についても考えてみましょう。射と射の合成を適当に定義すれば、任意のモノイドを「対象が一つの圏」として表現できます。圏の公理からわかるように、対象が一つしかない圏は、射の合成が結合則を満たし恒等射が単位元とみなせるからです。Haskellでそのような「対象が一つの圏」を定義してみましょう。Asこんな感じですね。対象がただ一つであることを表現したかったので、Unitというカインドを定義して、そのカインドを持つ型はUだけになるようにしています。as関数は幽霊型となっているaとbをいちいち指定するのが面倒くさいので作りました。ところで、列(HaskellにおいてはList)は自由モノイドなので、対象が一つで射がモノイドの列であるような圏は、対象が一つであり射がそのモノイドである圏への関手が存在するはずです。そのような関手をGeneralFunctorクラスで表現します。15}}良い感じですね。まとめ従来のFunctor、関数のArrowへの持ち上げ、モノイドの列の畳み込みといった、さまざまなことがGeneralFunctorクラスで表現できることがわかりました。関手という概念の汎用性の高さと、それを実装できるHaskellという言語の表現力の高さには驚かされますね。いろんな関手をHaskellで表現して遊んでみてください!おまけ実例のところにちょこちょこコードの断片を貼っていた、Sample.hsの全コードをここに貼っておきます。いうモジュールのことを教えて頂きました。ここに定義されているFunctorは、今回私が定義したのと同じように関手の名前ftagをFunctorクラスのインスタンスとすることで、メソッド(%)により射の対応付け、型族(:%)で対象の対応付けをしています。MultiParamClassesを使って関手の名前と関手で移る前後の圏をまとめてインスタンス化している私のGeneralFunctorより見た目が綺麗ですね。定義されていないので、対象が*以外の圏への関手はこのモジュールを使って書くことはできなさそうです。このモジュールに定義されている様々なFunctorを自分のGeneralFunctorを使って実装できないか試してみようと思います。requestStockLike17@tezca686ぼちぼち記事を書きます。