最近、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]]