美しい折り方を読んで 包み込むことでどんなものでもFoldable
作れること
に気がついたFunctor
data Store f a b = Store (f a) (a -> b)
シンプルなスマート コンストラクターを使用する場合:
store :: f a -> Store f a a
store x = Store x id
(これはStore comonad データ型の変形です。)
これで定義できます
instance Functor (Store f a) where
fmap f (Store x g) = Store x (f . g)
instance (F.Foldable f) => F.Foldable (Store f a) where
foldr f z (Store x g) = F.foldr (f . g) z x
このようにしてData.Set.Set
、Sjoerd Visscher と Sjoerd Visscher の両方をファンクターにすることができWeird
ます。(ただし、構造体はその値をメモ化しないため、使用した関数fmap
が複雑な場合、繰り返し折りたたむことは非常に非効率になる可能性があります。)
更新:これは、ファンクターであり、折りたたみ可能であるがトラバース可能ではない構造の例も提供します。トラバース可能にするStore
には、トラバース可能にする必要があり(->) r
ます。したがって、実装する必要があります
sequenceA :: Applicative f => (r -> (f a)) -> f (r -> a)
Either b
としましょうf
。次に、実装する必要があります
sequenceA' :: (r -> Either b a) -> Either b (r -> a)
明らかに、そのような機能はありません ( Djinnで確認できます)。だから私たちはどちらも実現できませんsequenceA
。