如何在Haskell中重复执行IO命令?

Hen*_*nes 10 haskell for-loop

blabla在Haskell中有一个函数,它接受一个I​​nt并返回一个字符串:

blabla :: Int -> [Char]
Run Code Online (Sandbox Code Playgroud)

我想在for循环中重复运行该方法,如下所示:

for i := 1 to 25 do begin
    write(i);
    write(": ");
    writeln(blabla(i));
end;
Run Code Online (Sandbox Code Playgroud)

haskell有for循环功能吗?

Aad*_*hah 14

模块中有一个forM_函数,Control.Monad类似于命令式编程语言中的for循环:

import Control.Monad (forM_)

blabla :: Int -> String
blabla = show

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

但是,我建议你远离这种命令式的代码.例如,相同的代码可以更简洁地编写为:

import Control.Monad (mapM_)

blabla :: Int -> String
blabla = show

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

希望有所帮助.

  • 我会让这段代码变得更加紧迫:`putStrLn $ unlines $ map(\ x - > concat [show x,":",fx])[1..25]`.有时候你需要一行一行地懒散地打印一个字符串,因为它很长甚至是无限的,但是对于一个短字符串,通常很好地一次构建整个东西并打印它. (3认同)

Hen*_*nes 7

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

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

main = putStrLn $ unlines blablaResults
Run Code Online (Sandbox Code Playgroud)

  • 对于这种特定情况,我认为这是最好的方法,因为它明确区分了计算和I/O. (4认同)