2012-01-26 139 views
3

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

说,我的清单存在于这个变量中。

let xs

请提出一个简单的方法来进行迭代。

+0

我们可以给予更具体的建议,如果你还解释*你想要的东西,而“迭代”的事情。 –

回答

3
map (map f) l 

其中f :: Char -> Foo是如果你想要一个功能f适用于像这样的列表中的每个元素的功能应用到每个Charl :: [[Char]]
回报l' :: [[Foo]]

12

[a, b, c, d] → [f a, f b, f c, f d] 

然后map f xs有窍门。 map将元素上的函数转换为列表上的函数。因此,我们可以将它嵌套在列表中进行操作:如果fa s转换为b s,则map (map f)[[a]]转换为[[b]] s。

如果你不是要为列表中的每个元素(这更像是传统的迭代)执行一些IO动作,那么你很可能在寻找forM_

forM_ :: [a] -> (a -> IO b) -> IO() 

你给它一个函数,并按顺序与列表中的每个元素进行调用。例如,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." 

如果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. 

forM_实际上有一个更一般的类型,但更简单我在这里展示的版本更具相关性。

+0

嗨谢谢你的答复。其实我想把每一个元素从列表中删除,并应用if-else consdition到那个。因此,我想将每个元素一个接一个地存储在“let元素”中,就像for循环一样。 – code4fun

+0

I已经更新了我的答案,以展示如何遍历执行IO的列表,同时为每个元素命名。 – ehird

+0

感谢您的帮助 – code4fun

3

迭代的“正确”方式实际上是折叠。任何你可能想要做的事都可以通过折叠来完成。让我们考虑你想做什么。你可能在想的是这样的:

for (row in xs): 
    for (c in row): 
    doSomething 

的问题是,你可能利用可变变量的doSomething。没关系,我们可以解决这个问题。所以假设你有这个。

def iter2d(xs): 
    outerVar = outerInit 
    for (row in xs): 
    innerVar = innerInit(row) 
    outerVar.adjust1(row) 
    for (c in row): 
     innerVar.adjust2(c) 
     outerVar.adjust3(c, innerVar) 
    return outerVar 

让我们把它翻译成折叠。和不变性。

iter2d :: [[Char]] -> Something 
iter2d xs = foldl' outerStep outerInit xs 
    where outerInit = ... -- same as outerInit above 
     outerStep acc row = fst $ foldl' innerStep innerInit' row) 
      where innerInit' = ((adjust1 acc row), innerInit row) 
     innerInit row = ... -- same as innerInit above 
     innerStep (outAcc, inAcc) c = (outAcc', inAcc') 
      where inAcc' = adjust2 inAcc c 
       outAcc' = adjust3 outAcc c inAcc' 

与永恒的通知,我们不得不指出outAc'取决于inAcc',而不是inAcc,意,它的更新innerVar后,“状态”。

现在你可能会说“哇哈斯克尔看起来很丑,为什么我会想要使用哈斯克尔”。是的,它看起来很丑陋,但仅仅因为我将它定制为命令式代码的直接翻译。一旦你习惯于使用折叠而不是“遍历列表”,那么你会发现折叠是一个非常强大的技术,它可以让你以比环允许更优雅的方式做很多事情。

+1

注意:map是fold的一个特例。 –

1

只是:

[c | x <- xs, c <- x]