fugafuga.write

日々のログ

すごいH本 part3

前回に引き続きやっていく

blog.tokoyax.com

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

今日はここまで。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

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