私がやろうとしているのは、(私が書いているモジュールで) 状態モナドの特定の型で動作する関数をエクスポートすることです (以下の例では、その型は になりますFoo
)。ただし、ユーザーが希望するタイプの関数を使用できるようにしたいと考えていますMonadState
: State.Lazy
、State.Strict
、StateT
など。
これが私がやりたいことの例です:
より良い質問で編集:
import Control.Monad.State
data Foo a = Foo { cnt :: Int, val :: a }
--test :: State (Foo a) a -- THIS WORKS
--test :: StateT (Foo a) Maybe a -- ...SO DOES THIS
-- ... BUT INCLUDING THE FOLLOWING SIGNATURE GIVES AN ERROR:
test :: MonadState (Foo a) m => m a
test = modify (\(Foo i a)-> Foo (i+1) a) >> gets val
上記の型を定義するには FlexibleInstances 拡張が必要であると GHC は訴えています。その拡張機能を使用して関数を定義する正しい方法ですか、それともより良い方法がありますか?
ありがとう