簡體   English   中英

IO操作中的Haskell遞歸

[英]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 (為簡單起見,我們從現在開始假設aInt 。)請注意,每次執行該操作都可以生成不同的隨機值; 這就是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM