46

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

4

1 に答える 1

62

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

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

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

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

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

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

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

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

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

于 2012-04-26T23:37:22.677 に答える