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

リストによる「くりかえし」: 転写

3倍したものの総和

「0から3nまでの3の倍数の総和」は「0からnの整数を3倍した値の総和」と同じだ。列挙した値を変換してから蓄積する。関数mapは各要素に同じ関数を適用した結果のリストを作成する。

転写

関数mapは第1引数として関数をとり第2引数のリストの要素すべてに適用する。

sum3N.hs

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

% ghci sum3N.hs
*Main> sum3N 10
165

ろ過と転写の両方を使う例

0からnまでの5の倍数ではない数を3倍したものの総和を求める。

sum3N5 :: Integer -> Integer
sum3N5 n = sum . map (* 3) $ filter ((/= 0) . (`mod` 5)) [0 .. n]

0からnまでの整数を「5の倍数でない」でろ過しそれらを3倍した値の総和を求めている。

*Main> sum3N5 10
120

課題

  1. 1からnまでの奇数を3倍した値すべての積を求める関数productOdd3を作成せよ

リストによる「くりかえし」のまとめ

  1. 列挙
  2. 複数のろ過・転写
  3. 蓄積

「リスト」の変換というわかりやすいメタファーで「くりかえし」を実現する。書きやすく読みやすく検証しやすく、バグが入りにくい。

「ろ過」へもどる 「リストによる『くりかえし』の空間効率」へ

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