0

だから私はこのコードを持っています

{-# 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 ...)

愚かな私。

4

1 に答える 1

4

MyStateT解決策は、定義から制約を削除することです:

newtype MyStateT a b { runMyStateT :: StateT A a b }
    deriving (Functor, Applicative, Monad, MonadIO, MonadState A)

とにかく関数シグネチャに入れる必要があるため、データ型制約は本質的に役に立ちません。そのため、その機能は実際には非推奨です

次のようにインスタンス化できるようにするには、制約が必要だと思います。

あまり; instance MonadA a => MonadA (MyStateT a)それがなくても問題なく動作します。

また、そのようなf作業の実装はありますか?

そうなる。MonadTransのインスタンスを提供したので、実際には明示的MyStateTにラップする必要はないことに注意してください。MyStateT

instance MonadA a => MonadA (MyStateT a) where
    f = lift . f
于 2015-09-15T09:57:07.910 に答える