Я хочу установить тип параметра состояния преобразователя монады состояния для соответствующего типа преобразователя монады. Однако это приводит к построению бесконечного типа,
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)