Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell:链接状态单子_Haskell - Fatal编程技术网

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 ()