だから私はこのコードを持っています
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import MonadA
data A = A
newtype MonadA a => MyStateT a b { runMyStateT :: StateT A a b }
deriving (Functor, Applicative, Monad, MonadIO, MonadState A)
instance MonadTrans MyStateT where
lift = MyStateT . lift
mそして、コンパイラは、 from 署名がlift型であることを証明できない、MonadAまたはそれがこれらの不可解なエラーメッセージの読み方であると不平を言っています。
Could not deduce (MonadA m) arising from a use of `MyStateT'
from the context (Monad m)
bound by the type signature for
lift :: Monad m => m a -> MyStateT m a
これに対処する方法はありますか?次のようにインスタンス化できるようにするには、制約が必要だと思います。
instance MonadA a => MonadA (MyStateT a) where
f = MyStateT . lift . f
また、そのようなf作業の実装はありますか? (上記のエラーのため、そこまで到達しませんでした)。内側のモナドの上fに解決するために右側に願っています。fa
編集newtype MonadA a => MyStateT ...:私が言及した正確なエラーを回避するために、型制約を削除するのに実際に役立ちました。ただし、以前に同じことが原因であると考えていた別のエラーがありました。上記のサンプル コードの続きを考えてみてください (いくつかの部分が繰り返され、現在は型の制約がありません)。
class MonadB m where
fB :: m ()
newtype MyStateT m a = MyStateT { runMyStateT :: StateT A m a}
deriving (... MonadState A ...)
instance MonadTrans MyStateT where
lift = MyStateT . lift
instance MonadA a => MonadA (MyStateT a) where
f = lift . f
instance MonadA a => MonadB (MyStateT a) where
fB = lift (modify (...))
エラーは
Could not deduce (a ~ StateT A m0) from context (MonadA (MyStateT a), MonadA a)
の実装でfB。以前、私はclass MonadA m => MonadB m役に立たなかった。aとマッチングしても意味がありませんStateT A m。それMyStateTのインスタンスはMonadState A機能するはずなので、いいえ?
編集:
OK、うまくいきました:
fB = MyStateT (modify ...)
愚かな私。