Ich möchte den Typ des Zustandsparameters eines Zustands-Monade-Transformators auf einen zugeordneten Typ dieses Monade-Transformators setzen. Dies führt jedoch eine unendliche Art bei der Konstruktion,haskell - Wie vermeidet man diesen unendlichen Typ? (Zugehörige Daten und StatusT)
s = AssocTyp (StateT s m) a
Die Intuition, warum ist dies nicht wirklich ein Problem ist, dass,
AssocTyp (StateT s m) a = AssocTyp (StateT s' m) a
für alle s
und s'
. Der Compiler ist jedoch nicht schlau genug, um das herauszufinden. Ich habe gelesen, dass in einigen Fällen ein neuer Typ verwendet werden kann, um unendliche Typen zu vermeiden; wie mache ich es?
Hier minimiert Code, um die Frage zu reproduzieren,
{-# 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, vielen Dank !! Ich denke, ich verwechsle Gleichheit auf Typ- und Datenebene. – gatoatigrado