weblog

技術的なメモ置き場。

Haskell リスト

定義

Haskellのリストは要素をカンマ区切りで並べ大括弧で囲む。
同じ型の要素しか格納できない。

haskell> [1, 2, 3]
[1,2,3]

ネスト

リストの中にリストを定義することができる。

haskell> [[1, 2], [3]]
[[1,2],[3]]

次元は揃える必要がある。エラーとなる。

haskell> [[1, 2], [3], 4]

<interactive>:179:1: error:
    • Non type-variable argument in the constraint: Num [a]
      (Use FlexibleContexts to permit this)
    • When checking the inferred type
        it :: forall a. (Num [a], Num a) => [[a]]

rangeを使用した生成

haskell> [1..10]
[1,2,3,4,5,6,7,8,9,10]
haskell> ['a'..'z']
"abcdefghijklmnopqrstuvwxyz"

ステップを指定すると2の倍数のみなどを生成できる。

haskell> [2,4..20]
[2,4,6,8,10,12,14,16,18,20]
haskell> [3,6..20]
[3,6,9,12,15,18]

減少するリストも生成が可能。

haskell> [20,18..2]
[20,18,16,14,12,10,8,6,4,2]

結合

++演算子 で結合できる。

haskell> [1, 2, 3] ++ [4, 5, 6]
[1,2,3,4,5,6]
haskell> ['a', 'b'] ++ ['c']
"abc"

先頭に追加

:演算子*1 で追加できる。

haskell> 0 : [1, 2, 3]
[0,1,2,3]

要素へのアクセス

要素番号指定

!!演算子 で要素番号を指定してアクセスできる。

haskell> [1, 2, 3] !! 0
1
haskell> [1, 2, 3] !! 2
3

先頭の要素

head関数 を使用する。

haskell> head [1, 2, 3]
1

末尾の要素

tail関数 を使用する。

haskell> last [1, 2, 3]
3

先頭以外の要素

tail関数 を使用する。

haskell> tail [1, 2, 3]
[2,3]

末尾以外の要素

init関数 を使用する。

haskell> init [1, 2, 3]
[1,2]

先頭から指定した数の要素

take関数 を使用する。

haskell> take 2 [1, 2, 3]
[1,2]
haskell> take 1 [1, 2, 3]
[1]
haskell> take 0 [1, 2, 3]
[]

先頭から指定した数の要素を除外した要素

drop関数 を使用する。

haskell> drop 1 [1, 2, 3]
[2,3]
haskell> drop 0 [1, 2, 3]
[1,2,3]
haskell> drop 3 [1, 2, 3]
[]

比較

< > <= >= == を使用して辞書順で比較する。
要素ごとに比較し、条件に一致した時点で比較が決まる。
素数が合わない場合も比較できる。

haskell> [1, 2, 3] < [2, 3, 4]
True
haskell> [9] > [1, 3]
True

Javaには無い機能。使いどころが不明。

長さ

length関数 を使用する。

haskell> length [1, 2, 3]
3

空判定

null関数 を使用する。

haskell> null []
True
haskell> null [1, 2, 3]
False

最大値

maximum関数 を使用する。

haskell> maximum [5, 2, 1, 6, 9]
9

最小値

minimum関数 を使用する。

haskell> minimum [5, 2, 1, 6, 9]
1

要素の和

sum関数 を使用する。

haskell> sum [1, 2, 3]
6

要素の積

product関数 を使用する。

haskell> product [1, 2, 3]
6
haskell> product [1, 2, 3, 4]
24

要素の存在確認

elem関数 を使用する。

haskell> elem 2 [1, 2, 3]
True
haskell> elem 5 [1, 2, 3]
False

*1:cons演算子とも呼ばれる