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 に答える