Haskell-リスト
リストとは
haskellにおけるリストとは、配列の様な物であり、要素の並びをひとまとまりにしたものです。
リストの中は同じ型の要素のみを扱います。異なる型要素は格納できません。
リストの形式は[ ]で囲み、「,(comma)」で区切ります。
[要素, 要素, 要素]
リストの生成
要素を指定してリストを作成する。
Prelude> ["one", "two", "three"]
["one","two","three"]
指定した範囲の整数の数列を作る。
Prelude> [3..10]
[3,4,5,6,7,8,9,10]
一定の間隔の整数の数列を作る。
Prelude> [1,3..10]
[1,3,5,7,9]
無限リストの作成
Haskellでは無限に続くリストを扱う事ができます。
式に無限リストが含まれていても、必要なリストだけを求め、解を得る事ができます。
$ cat list.hs
#!/usr/bin/env runghc
-- 奇数リストから8番目の要素まで表示する。
num_list = [1,3..]
main = print( take 8 num_list )
$ ./list.hs
[1,3,5,7,9,11,13,15]
内包表記
要素を計算によって作成してリストを生成します。
[要素 | 条件式]
条件式に記述できるものは以下の通りです。
- パターン <- リスト
- 真偽式
- let パターン = 式
例えば、100以下の偶数リストは生成する場合は以下の通りです。
[x | x <- [1..100], x `mod` 2 == 0]
引数の要素 n 個からなるリスト作成。
同一要素のリストを作成します。
Prelude> replicate 5 3
[3,3,3,3,3]
リスト要素の取得
リストの n 番目の値を取り出す。
リストの先頭は0番となります。
Prelude> [1,2,3,4,5] !! 2
3
リストの長さを取得する。
Prelude> length [1,2,3,4,5]
5
リストの先頭要素を取り出す。
Prelude> head [1,2,3,4,5]
1
リストの最終要素を取り出す。
Prelude> last [1,2,3,4,5]
5
先頭要素を除いた値を取り出す。
Prelude> tail [1,2,3,4,5]
[2,3,4,5]
最終要素を除いた値を取り出す。
Prelude> init [1,2,3,4,5]
[1,2,3,4]
先頭から n 個の要素を取り出す。
Prelude> take 3 [1,2,3,4,5]
[1,2,3]
条件に合う要素を取り出す。
リストの先頭から取得していきます。
Prelude> takeWhile (<=3) [1,2,3,4,5]
[1,2,3]
先頭から n 個の要素を除いたリストを取り出す。
Prelude> drop 3 [1,2,3,4,5]
[4,5]
条件に合わない要素を取り出す。
Prelude> dropWhile (<3) [1,2,3,4,5]
[3,4,5]
リスト要素の追加と分割
要素を先頭に追加する。
$ cat list.hs
#!/usr/bin/env runghc
arr = "zero" : ["one", "two", "Three"]
main = print( arr )
$ ./list.hs
["zero","one","two","Three"]
リストを連結する。
Prelude> [1,2,3] ++ [4,5]
[1,2,3,4,5]
リストを分割する。
Prelude> splitAt 5 [1..10]
([1,2,3,4,5],[6,7,8,9,10])
条件に合う要素と合わない要素でリストを分割する。
Prelude> span (< 5) [1..10]
([1,2,3,4],[5,6,7,8,9,10])
条件に合わない要素と合う要素でリストを分割する。
Prelude> break (> 5) [1..10]
([1,2,3,4,5],[6,7,8,9,10])
その他リスト操作
リスト要素の和を計算する。
Prelude> sum [1,2,3,4,5]
15
リスト要素の積を計算する。
Prelude> product [1,2,3,4,5]
120
リスト要素に関数を適用する。
Prelude> map (*2) [1,2,3,4,5]
[2,4,6,8,10]
二つのリストから、要素のペアを作る。
Prelude> zip [1,2,3] [4,5,6,7]
[(1,4),(2,5),(3,6)]
リスト要素を展開してリストにする。
Prelude> concat [[1,2,3],[4,5,6]]
[1,2,3,4,5,6]