前回に引き続きやっていく
Haskell のリスト
- 同じ型の要素を複数個格納できる
*Main Lib> let lostNumbers = [4,8,15,16,23,42] *Main Lib> lostNumbers [4,8,15,16,23,42]
リストの連結
*Main Lib> [1,2,3,4] ++ [5,6,7,8] [1,2,3,4,5,6,7,8]
文字列は文字のリストとして表現される
*Main Lib> "Hello" ++ " " ++ "World!!" "Hello World!!" *Main Lib> ['a','b'] ++ ['c','d'] "abcd"
リストの末尾に要素を追加する場合、左側のリストが全走査されるため処理に時間がかかる。 逆に、リストの先頭に要素を追加するのは軽い操作となる。
リストの先頭に要素を追加するには、:
を使う。(cons 演算子という)
*Main Lib> 'A':" SMALL CAT" "A SMALL CAT"
末尾に要素を1つだけ追加する場合、[] で囲む必要がある。
*Main Lib> [1,2,3] ++ 5 <interactive>:10: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] *Main Lib> [1,2,3] ++ [5] [1,2,3,5]
[1,2,3]
は、1:2:3:[]
のシンタックスシュガー
*Main Lib> 1:2:3:[] [1,2,3]
リストへのアクセス
!! {index}
でアクセスする- index は 0 始まり
*Main Lib> "Super H na book" !! 3 'e'
リストの入れ子
入れ子にできる
*Main Lib> let a = [[1,2],[3,4]] *Main Lib> a [[1,2],[3,4]]
リストのリストはリストしか要素に持てない
*Main Lib> a ++ [5,[6,7]] <interactive>:22:1: error: • Non type-variable argument in the constraint: Num [t] (Use FlexibleContexts to permit this) • When checking the inferred type it :: forall t. (Num [t], Num t) => [[t]] *Main Lib> a ++ [[6,7]] [[1,2],[3,4],[6,7]]
リストの比較
- 2つのリストの要素順に比較
- 最初に見つかった異なる値の順序で比較結果が決まる
- リストの長さは関係ない
*Main Lib> [9,9] < [1,1,1] False *Main Lib> [9,9] > [1,1,1] True
空でないリストは空リストより大きい
*Main Lib> [] < [0] True
リスト操作関数
-- 先頭要素 *Main Lib> head [1,2,3] 1 -- 先頭要素以外 *Main Lib> tail [1,2,3] [2,3] -- 末尾の要素 *Main Lib> last [1,2,3] 3 -- 末尾以外の要素 *Main Lib> init [1,2,3] [1,2] -- リストの長さ *Main Lib> length [4,5,6] 3 -- 空リストかどうか *Main Lib> null [1,2,3] False *Main Lib> null [] True -- 要素を逆順に並べ替える *Main Lib> reverse [1,2,3] [3,2,1] -- 先頭から指定した長さの要素のリストを取得 *Main Lib> take 2 [7,8,9] [7,8] *Main Lib> take 0 [7,8,9] [] -- 先頭から指定した長さの要素を省いたリストを取得 *Main Lib> drop 1 [7,8,9] [8,9] *Main Lib> drop 0 [7,8,9] [7,8,9] -- 要素の最大 *Main Lib> maximum [1,2,3] 3 -- 要素の最小 *Main Lib> minimum [1,2,3] 1 -- 合計 *Main Lib> sum [1,2,3] 6 -- 全要素の積 *Main Lib> product [1,2,3] 6 -- 指定した要素がリストに含まれているか -- バッククォートで囲む中置関数として使うと読みやすい *Main Lib> 3 `elem` [1,2,3] True *Main Lib> 4 `elem` [1,2,3] False
今日はここまで。

- 作者: MiranLipovaca
- 出版社/メーカー: オーム社
- 発売日: 2017/07/14
- メディア: Kindle版
- 購入: 4人 クリック: 9回
- この商品を含むブログを見る