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