我想将状态monad变换器的状态参数的类型设置为该monad变换器的关联类型。但是,这导致在构建无限类型,haskell - 如何避免这种无限类型? (相关数据和StateT)
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)
啊,非常感谢!我认为我在类型级别和数据级别上混淆了平等。 – gatoatigrado 2012-03-27 02:59:24