我想将状态单子转换器的状态参数的类型设置为该单子转换器的关联类型。但是,这会导致构造一个无限类型,
s = AssocTyp (StateT s m) a
关于为什么这不是一个真正的问题的直觉是,
AssocTyp (StateT s m) a = AssocTyp (StateT s' m) a
对于所有s
和s'
。但是,编译器不够聪明,无法解决这个问题。我读过,在某些情况下,可以使用 newtype 来避免无限类型;我该怎么做?
这是重现问题的最小化代码,
{-# 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)