haskell - IO动作中的Haskell递归
问题描述
仍然是一个初学者,无法弄清楚IO
动作中的递归循环。认为:
fMinInspect :: Int
fMinInspect = 1
fMaxInspect :: Int
fMaxInspect = 12
-- fNoInspectPerHour :: IO ()
fNoInspectPerHour = do
generateInspect <- randomRIO (fMinInspect,fMaxInspect)
putStrLn ""
我想为我想要随机检查的 10 台机器生成一个列表,然后我可以重复调用一些可以将 10 倍添fNoInspectPerHour
加到列表中的东西吗?
我尝试了一个外部函数,但我无法从IO ()
. 请注意,这putStrLn
只是终止do
-block,因为我不需要控制台输出。
PS。也欢迎在没有的情况下终止do
-block 的建议。putStrLn
解决方案
randomIO (fMinInspect, fMaxInspect)
是一个 IO 动作,一个类型的值(Num a, Random a) => IO a
。(为简单起见,我们假设a
从Int
现在开始。)请注意,动作的每次执行都可以生成不同的随机值;这就是作为生成随机值IO Int
的动作和作为随机值本身的区别。
一旦我们有了那个动作,我们就可以用replicate 10 (randomRIO (fMinInspect, fMaxInspect))
;创建一个动作列表。这将有[IO Int]
10 个 IO 操作的类型。
该sequence
函数可以将您的 IO 操作列表更改为生成值列表的 IO 操作(每个值由相应操作生成),将 type 的值转换为 type[IO Int]
的值IO [Int]
。
> fMinInspect = 1
> fMaxInspect = 12
> sequence (replicate 10 (randomRIO (fMinInspect, fMaxInspect)))
[1,6,6,1,7,5,8,4,7,7]
(这里,像往常一样,GCHi 正在执行由 生成的 IO 操作sequence
,并返回该 IO 操作生成的结果。)
推荐阅读
- ios - iOS 应用程序在使用 FirebaseApp.configure() 时崩溃
- laravel - 设置 SSL (https) 后站点内部链接不起作用
- c - Eclipse 中的 GDB 调试器找不到 FILE
- python - 定时器内部函数
- python - 在python中处理chainer.function.max_pooling_2d时出错
- amazon-web-services - 使用预签名 URL 在 S3 上部分上传
- laravel - DB::Raw() 查询更改 postgres 中的序列在 laravel 中不起作用
- linux - 如何提取符号并在文件中查看它们的偏移量
- php - PHP 正则表达式,未能跳过括号
- c# - 是否有其他方法可以显示数组中的特殊精灵