在大多数情况下,您不需要在列表上编写循环,它已经完成了。要使用 monadic 函数循环列表,您可以使用 mapM(如果您不关心结果,则使用它的 mapM_ 变体。)
如果你使用print,对于["1","2","3","4"],你会得到:
Prelude> mapM_ print ["1","2","3","4"]
"1"
"2"
"3"
"4"
Prelude>
print其实是:
print :: Show a => a -> IO ()
print x = putStrLn (show x)
show 函数将字符串 "1" 转换为 "\"1\"",putStrLn 打印该字符串并换行。
如果将print 替换为putStrLn,则删除转换步骤并直接打印字符串:
Prelude> mapM_ putStrLn ["1","2","3","4"]
1
2
3
4
Prelude>
现在我想提供另一种解决方案。 Haskell 的做事方式就是以纯粹的方式做尽可能多的事情,并且只在需要时使用 IO。
所以在这种情况下,我们可以使用\n 连接所有要打印的字符串,并一次打印所有字符串。
要连接所有字符串,有一个方便的函数:unlines
Prelude> unlines ["1","2","3","4"]
"1\n2\n3\n4\n"
Prelude>
现在您只需打印它;请注意unlines 在列表的最后一项之后添加了一个换行符,所以我们将使用putStr 而不是putStrLn
Prelude> putStr ( unlines ["1","2","3","4"] )
1
2
3
4
Prelude>