Je souhaite définir le type du paramètre d'état, d'un transformateur de monadat d'état, sur un type associé de ce transformateur monad. Cependant, il en résulte la construction d'un type infini,haskell - Comment éviter ce type infini? (Données associées et étatT)
s = AssocTyp (StateT s m) a
L'intuition pour expliquer pourquoi ce n'est pas vraiment un problème est que,
AssocTyp (StateT s m) a = AssocTyp (StateT s' m) a
pour tous s
et s'
. Cependant, le compilateur n'est pas assez intelligent pour comprendre cela. J'ai lu que dans certains cas, un newtype peut être utilisé pour éviter les types infinis; Comment fait-on ça?
est ici le code réduit pour reproduire la question,
{-# LANGUAGE KindSignatures, TypeFamilies #-}
import Control.Monad.Trans.State
class MyMonad (m :: * -> *) where
data AssocTyp m :: * -> *
instance MyMonad m => MyMonad (StateT s m) where
data AssocTyp (StateT s m) a = StateTA (AssocTyp m a)
isAssocTyp :: Monad m => (AssocTyp m a) -> m()
isAssocTyp x = return()
x = do
v <- get
isAssocTyp (v)
ah, merci beaucoup !! Je pense que je mélange l'égalité au niveau du type et au niveau des données. – gatoatigrado