23

私が理解している限り、ファンクターは 2 つのカテゴリ間のマッピングハです。DハD

Haskell には、オブジェクトが Haskell 型で射が Haskell 関数である Hask がありますただし、Functor型クラスには、これらのfmap間をマップする関数があります(したがって、これらはオブジェクトであり、カテゴリ自体ではありません)。

fmap :: (a -> b) -> f a -> f b

f aHaskf bの両方のオブジェクトです。これは、Haskellの のすべてのインスタンスがエンドファンクタであることを意味するのでしょうか。FunctorFunctor

ここで何が欠けていますか?タイプはHaskellのカテゴリでもありますか?

4

3 に答える 3

27

のインスタンスは2 つのことを指定します: kindFunctorの型コンストラクター、つまり Hask のオブジェクトから Hask のオブジェクトへのマッピング、および type の関数、つまり Hask のアローから Hask のアローへのマッピングであり、オブジェクトと互換性があります。 -マッピング。そうです、すべてのインスタンスはエンドファンクタです。Control.Categorical.Functorなど、Hackage で利用可能ないくつかの一般化があります。F* -> *(a -> b) -> (F a -> F b)FFunctor

于 2013-02-11T20:26:03.743 に答える
19

はい、すべてのFunctorインスタンスは Haskエンドファンクターです。実際、すべての Hask から、特定の型コンストラクターを適用することによって取得される型をオブジェクトとする適切なサブカテゴリへのエンドファンクターです。その型コンストラクターはFunctorインスタンスが関連付けられているものであり、オブジェクトのマッピングを提供します。射のマッピングは でありfmap、これは (デカルト閉圏のエンドファンクターのみに関係しているため) それ自体が Hask の射のファミリーです

反変ファンクター( Haskからその反対のカテゴリへ)Functorなど、インスタンスを持つことができるファンクター以外の他のファンクターを考慮することは理にかなっています。クラス内の関数はHaskのすべてから、オブジェクトが Hask のオブジェクトと同じであり、インスタンスが関連付けられている型コンストラクターによって射が記述されるカテゴリまで、ファンクターにも対応します。arrArrowArrow

さらに一般化することも可能ですが (Daniel Wagner が指摘しているように)、ますます使いにくくなる傾向があります。

于 2013-02-11T20:31:36.763 に答える
4

これに関する重要な点の 1 つは、本当に必要なのは単純な古いファンクターではなく、 Haskで強化されたファンクターであるということです。Haskはデカルト クローズ (実際にはそうではありませんが、そのようなものになろうと懸命に努力しています) であるため、それ自体が自然に強化されています。

さて、強化された endofunctor は、言語内で実装可能なものに制限する方法を提供します: 強化されたファンクターHask -> Haskは、オブジェクト (型) のレベルの関数であり、オブジェクトf aの各ペアに対して、 Haska, bのモーフィズムがf : Hask ( a,b) -> Hask (fa,fb) . もちろんこれだけはfmap :: (a -> b) -> f a -> f b

于 2013-02-13T10:45:06.473 に答える