gpt4 book ai didi

haskell - 状态的 `put` 和 `get` 函数

转载 作者:行者123 更新时间:2023-12-03 12:33:54 28 4
gpt4 key购买 nike

我在看 State Monadputget :

ghci> :t get
get :: MonadState s m => m s

ghci> :t runState
runState :: State s a -> s -> (a, s)

ghci> runState get [1,2,3]
([1,2,3],[1,2,3])

get的类型签名: MonadState s m => m s ,如何 [1,2,3]有一个类型 MonadState s m ?我不清楚 s 的类型是什么和 m是。

另外,请您多说一下如何使用 put ?

ghci> :t 放
put::MonadState s m => s -> m ()

总的来说,我好像不明白什么 MonadState s m是。你能解释一下 putget例子?

最佳答案

MonadState s m是类型类约束,而不是类型。签名:

get :: MonadState s m => m s

对一些 monad 说 m存储某种类型的状态 s , getm 中的一个 Action 返回 s 类型的值.这是非常抽象的,所以让我们用更少重载的版本 State 让它更具体一些。来自 transformers :
get :: State s s
put :: s -> State s ()

现在说我们要使用 State保持一个简单的计数器。让我们使用 execState而不是 runState所以我们可以只关注状态的最终值。我们可以 get计数器的值:
> execState get 0
0

我们可以使用 put 设置计数器的值:
> execState (put 1) 0
1

我们可以多次设置状态:
> execState (do put 1; put 2) 0
2

我们可以根据其当前值修改状态:
> execState (do x <- get; put (x + 1)) 0
1

此组合 getput很常见,有自己的名字, modify :
> execState (do modify (+ 1)) 0
1

> execState (do modify (+ 2); modify (* 5)) 0
10
MonadState是具有状态的 monad 类型的类。 State是该类的一个实例:
instance MonadState s (State s) where
get = Control.Monad.Trans.State.get
put = Control.Monad.Trans.State.put
StateT也是如此(状态 monad 转换器,将状态添加到另一个 monad)和其他各种类型。引入这种重载是为了如果你使用一堆 monad 转换器,你不需要显式 lift不同变压器之间的操作。如果你不这样做,你可以使用来自 transformers 的更简单的操作。 .

这是如何使用 State 的另一个示例用 Data.Map 封装变量映射:
import Control.Monad.Trans.State
import qualified Data.Map as M

action = do
modify (M.insert "x" 2) -- x = 2
modify (M.insert "y" 3) -- y = 3
x <- gets (M.! "x")
y <- gets (M.! "y")
modify (M.insert "z" (x + y)) -- z = x + y
modify (M.adjust (+ 2) "z") -- z += 2
gets (M.! "z") -- return z

main = do
let (result, vars) = execState action M.empty

putStr "Result: "
print result

putStr "Vars: "
print vars

关于haskell - 状态的 `put` 和 `get` 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25438575/

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