[英]Haskell recursion in IO action
還是一個初學者,無法確定IO
操作中的遞歸循環。 假設:
fMinInspect :: Int
fMinInspect = 1
fMaxInspect :: Int
fMaxInspect = 12
-- fNoInspectPerHour :: IO ()
fNoInspectPerHour = do
generateInspect <- randomRIO (fMinInspect,fMaxInspect)
putStrLn ""
我想為要隨機檢查的10台計算機生成一個列表,然后可以重復調用將添加10x fNoInspectPerHour
到列表中的計算機嗎?
我嘗試了外部函數,但無法從IO ()
獲得操作。 注意,因為我不需要控制台輸出,所以putStrLn
只是終止do
putStrLn
。
PS。 也歡迎提出關於在沒有putStrLn
情況下終止do
putStrLn
建議。
randomIO (fMinInspect, fMaxInspect)
是IO操作,值為(Num a, Random a) => IO a
。 (為簡單起見,我們從現在開始假設a
為Int
。)請注意,每次執行該操作都可以生成不同的隨機值; 這就是IO Int
是生成隨機值的動作與本身是隨機值之間的區別。
一旦有了該動作,就可以創建具有replicate 10 (randomRIO (fMinInspect, fMaxInspect))
的動作列表replicate 10 (randomRIO (fMinInspect, fMaxInspect))
; 這將是[IO Int]
類型,是IO操作的10個副本。
sequence
函數可以將IO操作列表更改為產生值列表的IO操作(每個值由相應操作生成),將[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操作產生的結果。)
如果您實際上打算在這里自己使用遞歸,則可以編寫例如
fNoInspectPerHour :: Int -> IO ()
fNoInspectPerHour 0 = return ()
fNoInspectPerHour n = do {
generateInspect <- randomRIO (fMinInspect,fMaxInspect) ;
-- Int IO Int
putStrLn generateInspect ; -- or do some other IO action
-- IO ()
fNoInspectPerHour (n-1)
-- IO ()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.