如何打印Haskell列表中的每个项目?

时间:2013-01-15 16:09:32

标签: haskell list-comprehension

我有一个列表:

[[1,2,3,4,5],[6,7,8,9]]

我正在尝试使用列表理解来完成它并且已经达到:

each_in_lists x = [show y | y <- x]

其中x是列表清单。

4 个答案:

答案 0 :(得分:8)

您是否尝试将其转换为字符串

> let x = [[1,2,3,4,5],[6,7,8,9]] 
> [show a | y <- x, a <- y]
["1","2","3","4","5","6","7","8","9"] 

如果您要打印,请使用printprint使用元素的show实例将其转换为字符串,然后使用putStrLn

> mapM_ (mapM_ print) x                          
1                                                                                   
2                                                                                   
3                                                                                   
4                                                                                   
5                                                                                   
6                                                                                   
7                                                                                   
8                                                                                   
9 

答案 1 :(得分:3)

扩展Satvik mapM_回答一些我认为如果不使用嵌套结构,它会使代码更具组合性:

> mapM_ (mapM_ print) x 

利用功能组合的结构。

> (mapM_.mapM_) print x

这样做的好处是你可以通过添加另一个mapM_来简单地将它扩展到列表列表,[[[a]]]。

> (mapM_.mapM_.mapM_) print x

此组合概念可以taken even further包含元组[[(a,a)]]和数据结构。这是在lens中完成的。打印[(a,a)]的所有元素的示例将是:

mapMOf_ (traverse.both) print [(1,2),(3,4),(5,6)]

答案 2 :(得分:3)

到目前为止,其他答案分享我认为是一个很大的缺陷:将问题分解为较小的子问题总是好的,而且他们不这样做。在这种情况下,适用的子问题是:

  1. 拼合嵌套列表
  2. 打印平面列表的内容
  3. #1的标准函数是concat

    >>> concat [[1,2,3,4,5],[6,7,8,9]]
    [1,2,3,4,5,6,7,8,9]
    

    现在,打印元素的最简单方法是mapM_ print,正如其他答案所暗示的那样:

    >>> mapM_ print (concat [[1,2,3,4,5],[6,7,8,9]])
    1
    2
    3
    4
    5
    6
    7
    8
    9
    

    这概括为各种情况,BTW:在Haskell中,顺序迭代某些结构元素的简单方法是将其转换为平面列表,然后处理列表。

答案 3 :(得分:1)

假设您正在尝试压缩列表并希望尽可能使用列表理解,我认为以下内容尽可能接近。

x = [[1,2,3,4,5],[6,7,8,9]]

sequence [print z | y <- x, z <- y]