[英]How can I execute IO commands repeatedly in Haskell?
我在Haskell中有一個函數blabla
,它接受一個Int並返回一個字符串:
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.