次のようなリストがあります。
[[1,2,3,4,5],[6,7,8,9]]
私はリスト内包表記を使用してそれをやろうとしていますが、次のようになっています:
each_in_lists x = [show y | y <- x]
x
リストのリストはどこにありますか。
次のようなリストがあります。
[[1,2,3,4,5],[6,7,8,9]]
私はリスト内包表記を使用してそれをやろうとしていますが、次のようになっています:
each_in_lists x = [show y | y <- x]
x
リストのリストはどこにありますか。
それを文字列に変換しようとしていますか
> 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
これまでの他の回答は、私が大きな欠点だと思うことを共有しています。問題を小さなサブ問題に分割することは常に良いことですが、彼らはそれを行いません。この場合、該当するサブ問題は次のとおりです。
#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 では、構造体の要素を順番に繰り返し処理する簡単な方法は、それをフラット リストに変換してから、リストを処理することです。
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)]
リストを平坦化しようとしていて、可能な限りリスト内包表記を使用したいと仮定すると、次のようになると思います。
x = [[1,2,3,4,5],[6,7,8,9]]
sequence [print z | y <- x, z <- y]