ehi*_*ird 16
如果要将函数f应用于列表的每个元素,如下所示:
[a, b, c, d] ? [f a, f b, f c, f d]
Run Code Online (Sandbox Code Playgroud)
然后map f xs做的伎俩.map将元素上的函数转换为列表上的函数.因此,我们可以将其嵌套以在列表列表上操作:如果f将as转换为bs,则将s map (map f)转换[[a]]为[[b]]s.
如果您想要为列表的每个元素执行一些IO操作(这更像传统的迭代),那么您可能正在寻找forM_:1
forM_ :: [a] -> (a -> IO b) -> IO ()
Run Code Online (Sandbox Code Playgroud)
你给它一个函数,它按顺序用列表的每个元素调用它.例如,forM_ xs putStrLn是一个IO动作,它将打印出xs自己行中的每个字符串.以下是更多参与使用的示例forM_:
main = do
...
forM_ xs $ \s -> do
putStrLn "Here's a string:"
forM_ s print
putStrLn "Now it's done."
Run Code Online (Sandbox Code Playgroud)
如果xs包含["hello", "world"],那么这将打印出来:
Here's a string:
'h'
'e'
'l'
'l'
'o'
Now it's done.
Here's a string:
'w'
'o'
'r'
'l'
'd'
Now it's done.
Run Code Online (Sandbox Code Playgroud)
1 forM_实际上有一个更通用的类型,但我所展示的更简单的版本在这里更相关.
map (map f) l
Run Code Online (Sandbox Code Playgroud)
其中是适用于每个并
返回的f :: Char -> Foo函数Charl :: [[Char]]l' :: [[Foo]]