gpt4 book ai didi

haskell - 如何在 State monad 中包装链式有状态计算?

转载 作者:行者123 更新时间:2023-12-02 11:00:48 25 4
gpt4 key购买 nike

我有以下格式的计算:s -> a -> s,其中s是某种状态的类型。这样的函数的结果也是下一次评估的状态。例如,

appendInt :: String -> Int -> String
appendInt s i = s ++ (show i)

然后,appendInt "Int: "1 将给出 "Int: 1",而 (appendInt $appendInt "Int: 1") 2 code> 将给出 “Int: 12”。但是,我找不到一种方法将这种计算放入 State Monad 中。

第一个猜测是s -> (s,s),但是a无法传入。然后,我尝试了(a -> s ) -> (s, a -> s),但是没有 a 就不可能得到 ss -> (a,s) 不起作用,因为 a 是输入而不是输出。

那么我应该如何包装这个计算呢? State monad 适合这个吗?

最佳答案

您可以使用 State 就可以了,甚至更好地使用 Writer:

import Control.Monad.Writer
import Control.Monad.State

appendInt :: Int -> Writer String ()
appendInt i = tell $ show i

appendInt' :: Int -> State String ()
appendInt' i = modify (++ show i)

main = do print . execWriter $ do
tell "Int: "
appendInt 1
appendInt 2
print . flip execState "Int: " $ do
appendInt' 1
appendInt' 2

关于haskell - 如何在 State monad 中包装链式有状态计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33007560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com