top page > computer > haskell > web_lecture > for_programmer > filter.html
更新日:
文責: 重城良国

リストによる「くりかえし」: ろ過

3の倍数のみ

0から3nまでの3の倍数の総和を求める。

手続き的に

  1. 変数i, sを用意
  2. 変数i, sを0で初期化
  3. iが3の倍数ならsにiを足したものをsに代入
  4. iに1足したものをiに代入
  5. iが3n以下なら3へ、そうでなければ6へ
  6. 変数sの値を返す

リストで

  1. 0から3nまでの整数のリストを作成
  2. リストから3の倍数だけをとりだす
  3. 総和を求める

ろ過

条件を満たすものだけをとりだすのが「ろ過」だ。関数filterは第1引数にBool値を返す関数をとりろ過を行う。3の倍数かどうかは3で割った余りと0との比較でわかる。

(== 0) . (`mod` 3)

列挙と総和のあいだにfilterによるろ過をはさむ。

sum3N.hs

sum3N :: Integer -> Integer
sum3N n = sum $ filter ((== 0) . (`mod` 3)) [0 .. 3 * n]

% ghci sum3N.hs
*Main> sum3N 10
165

まとめ

列挙した値のうち条件を満たすもののみを蓄積の対象にした。要素をしぼりこんだ新しいリストを作成する。しぼりこむ段階をろ過と呼ぶ。第1引数にBool値を返す関数をとる関数filterを使う。

課題

  1. 1から2 * n + 1までのすべての奇数の積を求める関数productOddsを作成せよ

「列挙と蓄積」へもどる 「転写」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics