Haskell 関数の定義とリスト操作関数

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

最近、Haskellの入門書を読んでいて、読んでる最中はなるほど!っと感動するんだけど、読んだ端から忘れていってしまうので、最初から読んだことをメモしておく。

一応、復習にもなるかな(^_^;)

演算の順序指定

ghci> 1 + 2 * 3
7
ghci> (1 + 2) * 3
9


関数の呼び出し

ghci> succ 5
6

succは「後者」が定義されている型を引数にとる。Intの場合の「後者」は次の数となる。

ghci> min 5 7
5
ghci> max 5 7
7

関数の適用は演算の中で最も優先度が高い。以下は同義となる。max引数の

ghci> succ 2 + max 1 3 + 1
7
ghci> (succ 2) + (max 1 3) + 1
7

max関数の引数に3 + 1を適用したい場合は以下の()になる。

ghci> (succ 2) + max 1 (3 + 1)
7

その他の例

ghci> succ 9 * 10
100
ghci> succ (9 * 10)
91


関数の定義

関数名 引数1 引数2 ... = 処理のように定義する。

ghci> doubleMe x = x * 2
ghci> doubleMe 4
8
ghci> doubleMe 8.3
16.6
ghci> doubleUs x y = doubleMe x + doubleMe y
ghci> doubleUs 3 5
16

if式はif ~ then ~ elseと記述する。

ghci> doubleSmallNumber x = if x > 100 then x else x*2
ghci> doubleSmallNumber 10
20
ghci> doubleSmallNumber 101
101

if式が返した値に+ 1する場合、

ghci> doubleSmallNumber x = (if x > 100 then x else x*2) + 1

とする。if式を()で囲み優先順位を指定しないと+ 1はelseの演算にかかってしまう。


リスト

ghci> let lostNumber = [4,8,15,16,23,42]
ghci> lostNumber 
[4,8,15,16,23,42]
リストの連結
ghci> [1,2,3,4] ++ [9,10,11,12]
[1,2,3,4,9,10,11,12]
ghci> [1,2,3,4] ++ [9,10,11,12]
[1,2,3,4,9,10,11,12]
ghci> "Hello" ++ " " ++ "World"
"Hello World"
ghci> ['H', 'e', 'l'] ++ ['l', 'o']
"Hello"
リストの先頭に追加
ghci> 5:[1,2,3,4]
[5,1,2,3,4]
ghci> 'A':['B', 'C', 'D']
"ABCD"

[1,2,3]1:2:3:[]と同義。1:2:[3] → 1:[2,3] → [1,2,3]と読むことができる。


リスト要素へのアクセス

!! indexでアクセスする。

ghci> "description" !! 3
'c'


リストの中のリスト
ghci> let ar = [[1,2,3],[4,5,6]]
ghci> 7:ar
ghci> [7]:ar
[[7],[1,2,3],[4,5,6]]
ghci> ar ++ [[7,8,9]]
[[1,2,3],[4,5,6],[7,8,9]]


リストの比較

先頭から順に比較していき、最初に判断がついた結果を返す。

ghci> [3,2,1] > [3,2,0]
True
ghci> [3,2,1] > [2,10,100]
True
ghci> [3,2,1] > [4,1]
False


リスト操作関数


head

先頭の要素を返す。

ghci> head [5,4,3,2,1] 
5


tail

先頭を取り除いたリストを返す。

ghci> tail [5,4,3,2,1] 
[4,3,2,1]


last

最後の要素を返す。

ghci> last [5,4,3,2,1] 
1


init

最後の要素以外を返す。

ghci> init [5,4,3,2,1] 
[5,4,3,2]


length

要素の長さを返す。

ghci> length [5,4,3,2,1] 
5
ghci> length [] 
0


null

リストが空であるか調べる。

ghci> null [5,4,3,2,1] 
False
ghci> null [] 
True


reverse

リストを逆順にする

ghci> reverse [5,4,3,2,1] 
[1,2,3,4,5]


take

先頭から指定数の要素を取り出したリストを返す。

ghci> take 3 [5,4,3,2,1] 
[5,4,3]
ghci> take 2 [5,4,3,2,1] 
[5,4]


drop

先頭から指定要素数を削除したリストを返す

ghci> drop 2 [5,4,3,2,1] 
[3,2,1]
ghci> drop 3 [5,4,3,2,1] 
[2,1]


maximum minimum

最大、最小の要素を返す。

ghci> maximum [5,4,3,2,1] 
5
ghci> minimum [5,4,3,2,1] 
1


sum product

リストの和、積を返す。

ghci> sum [5,4,3,2,1] 
15
ghci> product [5,4,3,2,1] 
120


elem

指定の値がリストに含まれているか確認する。中置で利用することが多い。

ghci> elem 3 [5,4,3,2,1] 
True
ghci> elem 10 [5,4,3,2,1] 
False
ghci> 3 `elem` [5,4,3,2,1] 
True


無限リスト

遅延評価なのでtake等で要求されたもののみ返す。

ghci> take 24 [1,2..]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]


cycle

受け取ったリストを無限に繰り返す。

ghci> take 24 (cycle [1,2,3])
[1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3]


repeat

与えられた値を無限に繰り返すリストを返す。

ghci> take 24 (repeat 2)
[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]


replicate

長さを指定して与えられた値を繰り返すリストを返す。

ghci> replicate 3 10
[10,10,10]
ghci> replicate 3 [10]
[[10],[10],[10]]
ghci> replicate 3 [10,10]
[[10,10],[10,10],[10,10]]