gpt4 book ai didi

Haskell:链接状态单子(monad)

转载 作者:行者123 更新时间:2023-12-03 12:30:19 24 4
gpt4 key购买 nike

如果我有一个洗牌“一副牌”的函数,我如何使用 State Monad 迭代定义的洗牌次数,然后返回结果?

例如,我有以下函数,它将对牌组进行 1 次洗牌,然后返回一张特定的牌:

step :: State [String] String
step = do
modify shuffle
deck <- get
pure $ bestCard deck

我想要做的是在返回值之前遍历状态更改 5 次。

我试过的是这样的:

steps :: Int -> State [String] String
steps n = case n of
0 -> do
deck <- get
pure $ bestCard deck
_ -> do
modify shuffle
steps (n - 1)

但这看起来远非正确的做法,即使它有效。

注意。我知道这可以在不使用 State Monad 的情况下完成,但我正在尝试使用这个示例来学习如何使用 State

编辑:

感谢@Koterpillar,我可以使用 replicateM 来获得我想要的东西。

evalState (replicateM n $ modify shuffle >> get >>= pure .bestCard)

最佳答案

最简洁的方法是replicateM_ ,它重复一个单子(monad) Action 指定的次数并丢弃结果:

replicateM_ 5 $ modify shuffle

因为 State 是一个 monad,你只需要关心重复一个 Action ,而不是专门使用 State。我通过searching Hoogle找到了上面的函数对于我想要的函数的签名:

Monad m => Int -> m a -> m ()

请注意,结果甚至不需要 monad,只需要一个 applicative:

replicateM_ :: Applicative m => Int -> m a -> m ()

关于Haskell:链接状态单子(monad),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55895692/

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