0

私がやろうとしているのは、(私が書いているモジュールで) 状態モナドの特定の型で動作する関数をエクスポートすることです (以下の例では、その型は になりますFoo)。ただし、ユーザーが希望するタイプの関数を使用できるようにしたいと考えていますMonadState: State.LazyState.StrictStateTなど。

これが私がやりたいことの例です:

より良い質問で編集:

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 は訴えています。その拡張機能を使用して関数を定義する正しい方法ですか、それともより良い方法がありますか?

ありがとう

4

1 に答える 1

2

MonadState 型クラスをそのまま使用することはできませんか?

{-# LANGUAGE FlexibleContexts #-}
import Control.Monad.State

data Foo a = Foo { cnt :: Int, val :: a }


test :: MonadState (Foo a) m => m a
test = modify (\(Foo i a)-> Foo (i+1) a) >> gets val

GHCiで問題なくロードされます。

編集: これは MTL-2.0 と GHCi-7.0.1 を使用しています

于 2010-12-02T21:38:28.860 に答える