Я занимаюсь текстовым приложением как способ узнать haskell. В основной части моего приложения я использую комбинацию состояния, рандов, и IO, как это:Как вы вызываете функцию, использующую подмножество текущего стека монад?
test :: StateT MyState (RandT StdGen IO)()
Я уже писал некоторые функции, которые я теперь хочу, чтобы сшить вместе, но эти функции были определены только монады (ей), которые им нужны, против полного стека. Я бы хотел избежать использования полного набора повсюду, если я могу помочь ему.
Вот пример, который показывает различные случаи я пытаюсь работать:
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
Googling высадился меня в модуле Control.Monad.Morph, который, кажется, чтобы сделать то, что я хочу, но Я не смог получить комбинацию, которая работает до сих пор.
Я также рассматривал типы, чтобы получить некоторые подсказки, но он немного превосходит то, что я понимаю на данный момент.
Любые предложения приветствуются!
Вы пробовали использовать классы MonadState и аналогичного типа? – bheklilr
Не так далеко, но пример от Майкла ниже дает мне место для начала, спасибо за ответ. Как я упоминал ниже, мне нужно сделать некоторое чтение, чтобы лучше понять, что это такое и как оно сравнивается с тем, что я делал. – Chris