J'ai une fonction qui compose deux monades:Pourquoi `hoist` contraint-il le paramètre type de cette monade?
comp :: Monad m => m a -> m b -> m b
Et deux exemples de ces monades, où le est « à l'intérieur » un Mfunctor
,
ms :: Monad m => m String
ms = undefined
tma :: (Monad m, MFunctor t) => t m a
tma = undefined
Maintenant, si je tente de composer ms
avec tma
:
tmas = hoist (\ma -> comp ma ms) tma
Je reçois cette erreur:
Could not deduce (a ~ [Char])
from the context (Monad m, MFunctor t)
bound by the inferred type of
comp :: (Monad m, MFunctor t) => t m b
at Coroutine.hs:607:1-40
`a' is a rigid type variable bound by
a type expected by the context: m a -> m a at Coroutine.hs:607:8
Expected type: m a
Actual type: m String
qui stipule que a
dans ms
doit être de type quelconque: ms :: Monad m => m a
.
Pourquoi est-ce et est-il un moyen de composer tma
avec des monades de paramètres spécifiques.
Je vois que la signature du palan est:
hoist :: (Monad m, MFunctor t) => (forall a. m a -> n a) -> t m b -> t n b
mais ne peut pas imaginer comment forall
AFFECTE ce que je suis en train de le faire, si elle a un effet.
Merci pour l'explication. La présence de 'forall' garantit-elle un certain niveau de correction? – chibro2