誰かが2つの違いを簡単に説明できますか?私は、モナドが単なる関手であるのに対して、エンドファンクターである部分を完全には理解していません。
1 に答える
ファンクターは、あるカテゴリーから別のカテゴリーに移動する場合があります。エンドファンクターは、開始カテゴリーとターゲットカテゴリーが同じであるファンクターです。
自己準同型対射と同じです。
さて、なぜモナドはエンドファンクターでなければならないのですか?
「モナドはエンドファンクターのカテゴリーの単なるモノイドである」という有名な引用があります。幸いなことに、他の誰かがこの回答でそれをかなりうまく説明しています。
モナドがエンドファンクターでなければならない重要なポイントはjoin
、Haskellで呼ばれるように、または圏µ
論で通常呼ばれるように、モナドの定義¹の一部であるということです。今
Prelude Control.Monad> :t join
join :: Monad m => m (m a) -> m a
したがって、ファンクターm
をオブジェクト(Haskでは、オブジェクトとしてのHaskellタイプのカテゴリーであり、射として機能するカテゴリー、タイプ)に適用した結果は、m
再び適用できるオブジェクトでなければなりません。つまり、ファンクターのドメインであるカテゴリーに属している必要がありますm
。
ファンクターは、そのドメインとコドメインが同じである場合(厳密には、そのコドメインがそのドメインのサブカテゴリである場合)、つまりエンドファンクターである場合にのみ、それ自体で構成できます。それ自体との構成可能性はモナドの定義の一部であるため、モナドはフォルティオリのエンドファンクターです。
¹1つの定義。あるいは、(>>=)
またはを使用してモナドを定義し、派生プロパティとしてbind
持つことができます。join