[英]State Monads - In Haskell
我正在尝试使用 integer state 创建一个计算器,它允许用户使用命令更新此 state。 这是我到目前为止所得到的。
{-# LANGUAGE FlexibleContexts #-}
import Control.Monad.Except
import Control.Monad.State
data CalcCmd = EnterC
| StoreC Int CalcCmd
| AddC Int CalcCmd
| MultC Int CalcCmd
| DivC Int CalcCmd
| SubC Int CalcCmd
run :: (MonadState Int m, MonadError String m) => CalcCmd -> m ()
run (EnterC) = return()
run (StoreC a b) = do
put (a)
run b
run (AddC a b) = do
modify((+) a)
run b
run (MultC a b) = do
modify((*) a)
run b
run (DivC a b) = do
modify ((div) a)
run b
run (SubC a b) = do
modify((-) a)
run b
无论命令是什么,state 总是以 0 结束。例如,“StoreC 7 (EnterC)”和“StoreC 7 (AddC 14 (DivC 3 EnterC))”都将 state 返回为 0。我是什么做错了吗?
教科书说 StoreC 命令应该手动更新 state 而 EnterC 命令应该终止计算,返回单位类型。
另外,当使用 state monads 时,无论 function 是什么,我都应该做一些事情吗?
无法重现。 runStateT (run cmd3:: CS ()) (0:: Int)
在这里返回Right ((), 7)
。 (其他人确实返回0
,因为div 3 ((+) 14 7) = div 3 21 = 0
和div 0 ((*) 2 10) = div 0 20 = 0
。换句话说,你的State
monad 正在做你要求它做的计算,所以你的误解,不管它是什么,可能与 state monads 无关。)
你确定你正在加载你保存的文件吗? 是否有可能你保存到一个不同于你从中加载的目录,例如? 或者可能忘记按保存(我什至见过它发生在专业人士身上......)?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.