人気ブログランキング | 話題のタグを見る

Data.List モジュールの使い方(17) Infinite lists

Data.List モジュールの Infinite lists セクションの関数は、いずれも、無限リストを発生させるための関数だ。どれも仕組みが単純なので使い方には迷わないだろう。

iterate は、第1引数の関数を、第2引数の初期値に繰り返し適用した結果の無限リストを生成する。無限リストなので take 関数で先頭部分をとり出さなければならない。
Prelude> take 10 $ iterate (*2) 1
[1,2,4,8,16,32,64,128,256,512]

repeat 関数は、第1引数の値だけを要素とする無限リストを作り出す。
Prelude> take 10 $ repeat 2
[2,2,2,2,2,2,2,2,2,2]

replicate 関数は、第1引数の長さだけ、第2引数の値だけを要素とするリストを作り出す。
Prelude> replicate 10 2
[2,2,2,2,2,2,2,2,2,2]

cycle 関数は、引数にリストをとり、そのリストを繰り返し出力する無限リストを作り出す。
Prelude> take 10 $ cycle [1,2,3]
[1,2,3,1,2,3,1,2,3,1]

これらの関数は規則性を持った数列を作るときに便利だ。たとえば、2進数のビット数とそれで表現できる整数の数を対応させたペアを作るときは次のようにする。
Prelude> zip [1..10] (iterate (*2) 2)
[(1,2),(2,4),(3,8),(4,16),(5,32),(6,64),(7,128),(8,256),(9,512),(10,1024)]

for ループで作るのと違って簡単に作れてしまう。

このように Data.List モジュールの関数を使い慣れると、手続き型のプログラム言語でループを使って記述していた繰り返しの操作を、リスト操作の関数で簡潔に記述することができる。
by tnomura9 | 2011-09-03 11:03 | Haskell | Comments(0)
<< Data.List モジュール... 踊ってみた >>