Я хочу установить тип параметра состояния, монадного трансформатора состояния, на связанный тип этого монадного трансформатора.Тем не менее, это приводит к созданию бесконечного типа,
s = AssocTyp (StateT s m) a
Интуиция о том, почему это на самом деле не является проблемой, заключается в том, что
AssocTyp (StateT s m) a = AssocTyp (StateT s' m) a
для всех s
и s'
.Тем не менее, компилятор не достаточно умен, чтобы понять это.Я читал, что в некоторых случаях новый тип может использоваться, чтобы избежать бесконечных типов;как мне это сделать?
Вот свернутый код для воспроизведения вопроса,
{-# 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)