我一直在用基於文本的應用程序來學習haskell。在我的應用程序的主要部分,我使用狀態,蘭特和IO的組合是這樣的:如何調用一個使用當前monad堆棧子集的函數?
test :: StateT MyState (RandT StdGen IO)()
我已經寫了一些功能,我現在要合併,但這些功能被定義只他們需要的monad(s)反對整個堆棧。如果我可以幫忙的話,我想避免使用全套。
這裏是顯示了不同的情況下,我試圖找出一個例子:
module Test.State where
import Control.Monad
import Control.Monad.Identity
import Control.Monad.Morph
import Control.Monad.Trans.Class
import Control.Monad.State
import Control.Monad.Random
import Data.Functor.Identity
import Data.Monoid
import System.Random
type MyState = Int
somethingThatModifiesState :: Int -> State MyState()
somethingThatModifiesState x = do
put x
return()
somethingThatUsesIO :: Int -> IO()
somethingThatUsesIO x = print x
somethingInRandom :: Rand StdGen Int
somethingInRandom = getRandomR (0,10)
somethingInStateAndRand :: StateT MyState (Rand StdGen) Int
somethingInStateAndRand = do
y <- getRandomR (0,10)
put y
return y
test :: StateT MyState (RandT StdGen IO)()
test = do
x <- somethingInRandom -- fail :(
_ <- somethingThatModifiesState x -- fail :(
_ <- somethingInStateAndRand -- fail :(
s <- get -- ok!
liftIO $ somethingThatUsesIO s -- ok!
return()
myState :: Int
myState = 17
run = do
g <- getStdGen
runRandT (runStateT test myState) g
谷歌搜索已經登陸我似乎做那種事情,我想,但Control.Monad.Morph模塊我還沒有能夠得到迄今爲止工作的組合。
我也一直在尋找類型來獲得一些提示,但它有點超出了我目前的理解。
任何建議,非常感謝!
你有沒有嘗試過使用'MonadState'和類似的類? – bheklilr
不是那麼遠,但下面Michael的例子給了我一個開始的地方,謝謝你的回覆。正如我在下面提到的,我需要做一些閱讀以更好地理解這是什麼以及它與我一直在做的事情的比較。 – Chris