迭代haskell中的列表

cod*_*fun 5 haskell

我有一个字符列表列表::[[Char]].我需要遍历字符串列表以及每个字符串中的每个字符.

比如说,我的列表出现在这个变量中.

let xs

请建议一种简单的迭代方法.

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将元素上的函数转换为列表上的函数.因此,我们可以将其嵌套以在列表列表上操作:如果fas转换为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_实际上有一个更通用的类型,但我所展示的更简单的版本在这里更相关.


小智 5

只是:

[c | x <- xs, c <- x]
Run Code Online (Sandbox Code Playgroud)


Dan*_* D. 3

map (map f) l
Run Code Online (Sandbox Code Playgroud)

其中是适用于每个并 返回的f :: Char -> Foo函数Charl :: [[Char]]
l' :: [[Foo]]