簡體   English   中英

如何在Haskell中重復執行IO命令?

[英]How can I execute IO commands repeatedly in Haskell?

我在Haskell中有一個函數blabla ,它接受一個I​​nt並返回一個字符串:

blabla :: Int -> [Char]

我想在for循環中重復運行該方法,如下所示:

for i := 1 to 25 do begin
    write(i);
    write(": ");
    writeln(blabla(i));
end;

haskell有for循環功能嗎?

Control.Monad模塊中有一個forM_函數,類似於命令式編程語言中的for循環:

import Control.Monad (forM_)

blabla :: Int -> String
blabla = show

main = forM_ [1..25] $ \i -> do
    putStr   (show i)
    putStr   ": "
    putStrLn (blabla i)

但是,我建議你遠離這種命令式的代碼。 例如,相同的代碼可以更簡潔地編寫為:

import Control.Monad (mapM_)

blabla :: Int -> String
blabla = show

main = mapM_ (\i -> putStrLn $ show i ++ ": " ++ blabla i) [1..25]

希望有所幫助。

喝了一杯茶,我得到了最好的結果,我想:

blablaResults = map (\x -> show x ++ ":" ++ blabla x) [0..25]

main = putStrLn $ unlines blablaResults

你仍然在以程序的方式思考。 嘗試用列表來思考,而不是用循環來思考。

然后你想要的是這樣的列表: [1,f(1),2,f(2),3,f(3)...,n,f(n)]

這是map進入圖片的地方。 如果你有一個函數f並想將它應用於列表[1,2,3...,n] ,你可以使用map f [1..n]

你想要的是一個函數,它接受一個數字i並將函數f應用於它,然后用[i,f(i)]或者一個元組(i,f(i))作出響應。 因此,您創建此功能並將其映射到列表。

當然,您需要創建要執行的初始列表 - 來自[1..n]的列表。

另一種方法是使用列表理解:

forloop n = [(x,f x)|x <- [1..n] ]

(注意:我現在沒有Haskell編譯器,所以我需要稍后驗證最后一部分。我相信它應該如所示的那樣工作)。

我想,我自己得到了它:

blablaOutput :: [Int] -> IO()
blablaOutput (x:xs) = do 
  putStrLn (blabla x)
  blablaOutput xs
blablaOutput _ = putStrLn "That's all, folks!"  

main = blablaOutput [0..25]

當然在函數式編程方面不是很有用,但它確實有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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