私がやっていることは、(私が書いている)状態モナドの特定の型で動作する関数をエクスポートすることです(以下の例では、そのタイプはFoo
となります)。しかし、私は彼らが望むどんなタイプのMonadState
でも関数を使用できるようにしたいと考えています:State.Lazy
、State.Strict
、StateT
などです。そのため、その外側のモナドで多形でなければなりません。特定の状態データ型の多形MonadState関数のエクスポート
は私がやりたいの例です:
EDITEDより良い質問と:
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
GHC FlexibleInstancesの拡張子は、上記のタイプを定義するために必要であることを訴えます。その拡張機能を使用して私の機能を定義する正しい方法か、より良い方法がありますか?
おかげ
このような何かはおそらく動作するはずです - 私は、現時点ではそれをテストすることはできません(とその未フォーマット取得)怖いです:[_ test :: MonadState(Foo a)m => ma _] –