【发布时间】:2016-04-13 18:26:04
【问题描述】:
我为语句创建了简单的评估器。
我想使用变压器来实现 - 将 IO monad 与 State 混合使用。
有人可以解释怎么做吗?这是我无法处理的东西——变形金刚。
execStmt :: Stmt -> State (Map.Map String Int) ()
execStmt s = case s of
SAssigment v e -> get >>= (\s -> put (Map.insert v (fromJust (runReader (evalExpM e) s)) s))
SIf e s1 s2 -> get >>= (\s -> case (fromJust (runReader (evalExpM e) s)) of
0 -> execStmt s2
_ -> execStmt s1
)
SSkip -> return ()
SSequence s1 s2 -> get >>= (\s -> (execStmt s1) >>= (\s' -> execStmt s2))
SWhile e s1 -> get >>= (\s -> case (fromJust (runReader (evalExpM e) s)) of
0 -> return ()
_ -> (execStmt s1) >>= (\s' -> execStmt (SWhile e s1)))
execStmt' :: Stmt -> IO ()
execStmt' stmt = putStrLn $ show $ snd $ runState (execStmt stmt) Map.empty
【问题讨论】:
-
你知道如何在没有转换器的情况下做到这一点吗?你能手工制作一个
IO + Statemonad 吗? -
目前这个函数的编写方式显示出对“monad”抽象的严重误解。在开始使用转换器之前,您应该首先尝试实现您当前的功能,以免偏颇,并可能使用 monad 组合器。
-
@HaskellFun 你自己理解 State monad(如何实现)?
-
可以,我可以实现bind和return。
标签: haskell monads monad-transformers state-monad io-monad