La lecture de Belle pliage
J'ai réalisé que tout Foldable
peut être fait une Functor
en l'enveloppant dans
data Store f a b = Store (f a) (a -> b)
avec un simple smart constructeur:
store :: f a -> Store f a a
store x = Store x id
(C'est juste une variante de la Boutique comonad type de données.)
Nous pouvons maintenant définir
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
De cette façon, nous pouvons faire les deux Data.Set.Set
et Sjoerd Visscher l' Iter
un foncteur. (Cependant, puisque la structure n'est pas memoize à ses valeurs, à plusieurs reprises, se repliant sur elle pourrait être très inefficace, si la fonction que nous avons utilisé, en fmap
est complexe.)
Mise à jour: il fournit également un exemple d'une structure qui est un foncteur, pliable, mais pas traversable. Pour faire Store
traversable, nous aurions besoin de prendre (->) r
traversable. Nous avions donc besoin de mettre en œuvre
sequenceA :: Applicative f => (r -> (f a)) -> f (r -> a)
Prenons Either b
pour f
. Alors que nous aurions besoin pour mettre en œuvre
sequenceA' :: (r -> Either b a) -> Either b (r -> a)
Clairement, il n'y a pas une telle fonction (vous pouvez vérifier avec Djinn). Donc, nous ne pouvons ni nous réalisons sequenceA
.