繁体   English   中英

State 单子 - 在 Haskell

[英]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 是什么,我都应该做一些事情吗?

这是 output。 在此处输入图像描述

无法重现。 runStateT (run cmd3:: CS ()) (0:: Int)在这里返回Right ((), 7) (其他人确实返回0 ,因为div 3 ((+) 14 7) = div 3 21 = 0div 0 ((*) 2 10) = div 0 20 = 0 。换句话说,你的State monad 正在做你要求它做的计算,所以你的误解,不管它是什么,可能与 state monads 无关。)

你确定你正在加载你保存的文件吗? 是否有可能你保存到一个不同于你从中加载的目录,例如? 或者可能忘记按保存(我什至见过它发生在专业人士身上......)?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM