2010-12-02 8 views
0

私がやっていることは、(私が書いている)状態モナドの特定の型で動作する関数をエクスポートすることです(以下の例では、そのタイプはFooとなります)。しかし、私は彼らが望むどんなタイプのMonadStateでも関数を使用できるようにしたいと考えています:State.LazyState.StrictStateTなどです。そのため、その外側のモナドで多形でなければなりません。特定の状態データ型の多形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の拡張子は、上記のタイプを定義するために必要であることを訴えます。その拡張機能を使用して私の機能を定義する正しい方法か、より良い方法がありますか?

おかげ

+0

このような何かはおそらく動作するはずです - 私は、現時点ではそれをテストすることはできません(とその未フォーマット取得)怖いです:[_ test :: MonadState(Foo a)m => ma _] –

答えて

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では正常にロードされます。

EDIT:これは、MTL-2.0であり、GHCiの-7.0.1

+0

元の投稿に入力したタイプシグネチャを含める必要がありましたが、残っています。編集されました。私の本当の疑問は、このFlexibleContextsフラグがこれを行うための適切な(または唯一の)方法かどうかということです。 – jberryman

+2

はい、私はFlexibleContextsが必要と信じています。 Haskell Primeに提案されています。私は他のHaskellコンパイラ(jhc、uhc)がサポートしている、またはサポートされていることを賭けているので、避けすぎないようにしています。 –

関連する問題