11

Applicativeより深く勉強するうちに、私は にたどり着きましたTraversableLYHGGFoldableからは知っていましたが、前者はまだ見ていないので、Traversable に関する Haskell wikiを読み始めました。

それを読んでいるうちに、 が に平行で、 が に平行である理由Foldable.foldがわかりました。Traversable.sequenceAFoldable.foldMapTraversable.traverse

また、 everyTraversableも aFoldableおよび aFunctorでありsequenceAtraversal相互にデフォルトの実装があることも確認しました。

traverse f = sequenceA . fmap f
sequenceA = traverse id

foldMapしたがって、の最小完全定義であるLYHGG で見たようにFoldable、それは と平行であると考えたtraverseので、fold(これは と平行ですsequenceA) も最小完全定義になります (そうではありません)...Foldableはではないので、これを適用することはできませんFunctorTraversable

foldMap f = fold . fmap f
fold = foldMap id -- this is ok

なぜすべてFoldableが aではないのでしょうか?実際には ではないFunctorインスタンスは何でしょうか?FoldableFunctor

4

1 に答える 1

9

dfeuer が言うように、はではないSetの良い例です。FoldableFunctor

のタイプを考えてみましょうSet.map:

map :: Ord b => (a -> b) -> Set a -> Set b

これはほぼ ですが、追加の制約fmapが必要であることに注意してください。Ord bこの制約があるため、 のインスタンスにすることはできませんFunctor

Setこの制限があっても、 は Haskell のファンクターではないことに注意してください。巧妙に設定されたEqインスタンスが与えられた場合、その法則を破ることができますfmap f . fmap g === fmap (f . g)。詳細については、このスタック オーバーフローの質問を参照してください。

そこで指摘されているように、Set セットHaskとして順序付けられた型を持ち、射として順序を維持するマップを持つ「のサブカテゴリ」の (endo) ファンクタがあります。

したがって、明らかでなくてもSet、ファンクターを作成できないという事実は、実際には、型クラスの機構の制限だけでなく、真の数学的問題を示唆しています。

于 2016-03-08T02:27:20.513 に答える