update.Functor(関手)の話です。HaskellのFunctorクラスはHask圏からHask圏への関手しか表現できません。そこで、Hask圏以外の圏についても使える関手のクラスを書いてみました。́σー`)エヘヘ基本的な用語と、HaskellのFunctorクラス別のところにまとめましたこの章に書こうとしていた、「基本的な用語の確認とHaskellのFunctorクラス」についての内容は、別の記事にまとめさせて貰いました。内容としては、「HaskellのFunctorクラスはHask圏からHask圏への関手しか表現できません。」という文章の説明なので、それを読んで「そらそうだろ」って感じなら読み飛ばして次の章を読んで頂いて大丈夫です。とびだせ!Hask圏HaskellのFunctorは、Hask圏からHask圏への関手を表現しています。私の今回の目的は、もっと一般的な圏から圏への関手を表現できるFunctorクラスを作り、Hask圏から飛び出すことです。一般的なFunctorクラス以下が今回書いた「もっと一般的なFunctor」のクラスです。いう名前のクラスにしました。対象を*以外のカインドの型にもできるように、PolyKinds拡張が使われています。このクラスは、c1という圏からc2という圏への関手を表現しているのですが、移る前の圏と移る先の圏を決定しても、そのあいだの関手は唯一つに定まるとは限りません。そのため、それぞれの関手に名前をつけてnameという型を使って、どのインスタンス宣言が呼び出されるのか曖昧さがなく決定できるようにします。対応させる」という性質を表現しています。対応させる」という性質を表現しています。記事の最後にコードを全部貼り付けるので、使っている拡張機能やimportしているモジュールはそちらで確認して下さい。従来のFunctorでは、さっそくGeneralFunctorクラスを使ってみます。従来のHaskellのFunctorをGeneralFunctorクラスで表現してみます。fという型をつくり、それを第一引数としてgmapを呼び出すことでfmapと同じ働き(射の対応付け)ができていることが確認できます。ArrowつぎはArrowの話です。HackegeのArrowにも書かれている通り、ArrowクラスはCategoryクラスを継承しています。満たす必要があります。これを言い換えると、Arrowクラスのインスタンスは圏であるHask圏の射をarrでArrowのインスタンスである圏の射に対応付けるHask圏の対象の型はArrowのインスタンスである圏の同じ型に対応づけるこの対応付けは関手則を満たすというこうとが要求されているとわかります。この、Hask圏からの関手をGeneralFunctorクラスで表現してみましょう。