2010-12-02 72 views
0

我正在做的是(在我正在編寫的模塊中)導出一個在狀態monad中的特定類型上工作的函數(在下面的示例中,該類型將是Foo)。不過,我希望用戶能夠使用他們希望的任何MonadState類型的函數:State.LazyState.Strict,StateT等。因此,它需要在其外部狀態monad中具有多態性。爲特定狀態數據類型導出一個多態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 _] – 2010-12-02 21:33:54

回答

2

你不能只使用MonadState typeclass嗎?

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

+0

我應該包含您在原始文章中提供的類型簽名,但它被遺漏了。編輯。我想我真正的問題是,這個FlexibleContexts標誌是否是正確的(或唯一的)方式來做到這一點。 – jberryman 2010-12-03 00:10:09