状態モナドトランスフォーマーの状態パラメータのタイプを、そのモナドトランスの関連タイプに設定したいとします。しかし、これは無限の種類を構築することになる、これは本当に問題ではありません理由としてhaskell - この無限の型を避けるにはどうすればいいですか? (関連するデータとStateT)
s = AssocTyp (StateT s m) a
直感はすべてs
とs'
ため
AssocTyp (StateT s m) a = AssocTyp (StateT s' m) a
、ということです。しかし、コンパイラはこれを理解するほどスマートではありません。いくつかのケースでは、無限型を避けるために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