Haskell:链接状态单子
如果我有一个洗牌“牌组”的函数,我如何使用Haskell:链接状态单子,haskell,Haskell,如果我有一个洗牌“牌组”的函数,我如何使用状态Monad迭代定义的洗牌次数,然后返回结果 例如,我有以下函数,将对牌组执行1次洗牌,然后返回一张特定的牌: step :: State [String] String step = do modify shuffle deck <- get pure $ bestCard deck step::State[String]String 步骤=做 修改洗牌 甲板状态[字符串]字符串 步骤n=第n种情况 0->do 甲板 修改洗牌 步
状态Monad
迭代定义的洗牌次数,然后返回结果
例如,我有以下函数,将对牌组执行1次洗牌,然后返回一张特定的牌:
step :: State [String] String
step = do
modify shuffle
deck <- get
pure $ bestCard deck
step::State[String]String
步骤=做
修改洗牌
甲板状态[字符串]字符串
步骤n=第n种情况
0->do
甲板
修改洗牌
步骤(n-1)
但这看起来远不是正确的做法,即使它有效
注意。我知道这可以在不使用状态Monad
的情况下完成,但我正在尝试使用此示例来学习如何使用状态
编辑:
多亏了@Koterpillar,我可以使用replicateM
获得我想要的东西
evalState(replicitem n$modify shuffle>>get>>=pure.bestCard)
最简洁的方法是,将一个一元操作重复指定次数并丢弃结果:
replicateM_ 5 $ modify shuffle
因为State是一个monad,所以您只需要关心重复操作,而不需要专门处理State。我找到了上面的函数作为我想要的函数的签名:
Monad m => Int -> m a -> m ()
请注意,结果甚至不需要monad,只需要一个应用程序:
replicateM_ :: Applicative m => Int -> m a -> m ()
谢谢,实际上需要保留值,所以
replicItem
就是这样。您仍在使用>
丢弃值。但是没有要绑定的值吗<代码>修改洗牌;噢,我误读了优先顺序。如果你想每次都拿出最好的卡片,你需要replicateM
。
replicateM_ :: Applicative m => Int -> m a -> m ()