fugafuga.write

日々のログ



すごいH本 part5

引き続き

リスト内包表記

  • 集合の内包的記法の概念に近いもの、らしい

集合論 - Wikibooks

よくわからんので見てゆくことにする

これがリストの内包表記らしい

*Main Lib> [x*2 | x <- [1..10]]
[2,4,6,8,10,12,14,16,18,20]
  1. リスト[1..10]から要素を取り出す
  2. x に束縛
  3. |の左側で x に対して処理を行い出力する

利点がよくわからんので先を読み進める

内包表記に条件を追加する

  • 内包表記の条件のことを述語という
*Main Lib> [x*2 | x <- [1..10], x*2 >= 12]
[12,14,16,18,20]

ここでいう述語は、x*2 >= 12でリストの最後にカンマで追加する。

述語を使ってリストを間引くことをフィルタすると言う。

他の例

boomBangs xs = [ if x < 10 then "BOOM!!!" else "BANG!!!" | x <- xs, odd x]
  • 10以上の全ての奇数を"BANG!!!"にする
  • 10より小さい全ての奇数を"BOOM!!!"にする
  • odd x は奇数の時、True を返す
  • フィルタでFalseと判定された要素はリストに出力されない
*Main> boomBangs [7..13]
["BOOM!!!","BOOM!!!","BANG!!!","BANG!!!"]

フィルタはカンマ区切りで複数適用できる

-- 10 から 20 の中で、13, 15, 20 以外
*Main> [ x | x <- [10..20], x /= 13, x /= 15, x /= 20]
[10,11,12,14,16,17,18,19]

複数のリストから要素を取得できる

*Main> [ x * y | x <- [1,2,3], y <- [4,5,6]]
[4,5,6,8,10,12,12,15,18]

この場合、2つのリストの要素の全組み合わせが結果のリストに反映される

入れ子になったリストの内包表記

-- 入れ子リストから奇数を取り除く
*Main> [ [ x | x <- xs, even x ] | xs <- xxs]
[[2],[2,4],[8,6]]

今日はここまで。

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

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

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