web-dev-qa-db-ja.com

ファンクターとエンドファンクターの違い

誰かが2つの違いを簡単に説明できますか?私は、モナドが単なる関手であるのに対して、エンドファンクターである部分を完全には理解していません。

44
Jonathan Dunlap

ファンクターは、あるカテゴリーから別のカテゴリーに移動する場合があります。エンドファンクターは、開始カテゴリーとターゲットカテゴリーが同じであるファンクターです。

自己準同型対射と同じです。

さて、なぜモナドはエンドファンクターでなければならないのですか?

「モナドはエンドファンクターのカテゴリーの単なるモノイドである」という有名な引用があります。幸いなことに、他の誰かがすでにそれをかなりうまく説明しています この回答では

モナドがエンドファンクターでなければならない重要な点は、Haskellで呼ばれるjoin、または圏論で通常呼ばれるµが、の定義¹の一部であるということです。モナド。今

Prelude Control.Monad> :t join
join :: Monad m => m (m a) -> m a

したがって、ファンクターmをオブジェクト(Haskでは、オブジェクトとしてのHaskell型のカテゴリー、射としての関数、型)に適用した結果は、mを再び適用できるオブジェクトでなければなりません。に。つまり、ファンクターmの定義域であるカテゴリーに属している必要があります。

ファンクターは、そのドメインとコドメインが同じである場合(厳密には、そのコドメインがそのドメインのサブカテゴリである場合)、つまりエンドファンクターである場合にのみ、それ自体で構成できます。それ自体との構成可能性はモナドの定義の一部であるため、モナドはフォルティオリのエンドファンクターです。

¹1つの定義。代わりに、(>>=)またはbindを使用してモナドを定義し、派生プロパティとしてjoinを持つことができます。

58
Daniel Fischer