3

我有一个类似的列表:

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

我正在尝试使用列表理解来做到这一点,并且已经达到:

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

x列表列表在哪里。

4

4 回答 4

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"] 

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

> mapM_ (mapM_ print) x                          
1                                                                                   
2                                                                                   
3                                                                                   
4                                                                                   
5                                                                                   
6                                                                                   
7                                                                                   
8                                                                                   
9 
于 2013-01-15T16:14:59.683 回答
4

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

  1. 展平嵌套列表
  2. 打印平面列表的内容

执行 #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

这可以推广到各种情况,顺便说一句:在 Haskell 中,顺序迭代某些结构的元素的直接方法是将其转换为平面列表,然后处理该列表。

于 2013-01-15T21:59:41.997 回答
3

扩展 Satvik mapM_ 回答一些我认为如果不是使用嵌套结构,例如:

> mapM_ (mapM_ print) x 

一种利用功能组合的结构。

> (mapM_.mapM_) print x

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

> (mapM_.mapM_.mapM_) print x

这种组合概念甚至可以进一步包括元组 [[(a,a)]] 和数据结构。这是在lens中完成的。打印 [(a,a)] 的所有元素的示例是:

mapMOf_ (traverse.both) print [(1,2),(3,4),(5,6)]
于 2013-01-15T17:32:52.610 回答
1

假设您正在尝试展平列表并希望尽可能多地使用列表理解,我认为以下内容与您将得到的最接近。

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

sequence [print z | y <- x, z <- y]
于 2013-01-15T16:40:00.437 回答