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

リストの要素の総和

はじめに

再帰関数とリストのパターンマッチを学んだ。リストを引数としてとる再帰関数が定義できる。リストの総和を求める関数sumを再定義する。

動き

% ghci
Prelude> sum [3, 8, 2]
13

関数mySumはInteger型のリストからその総和を求める。

mySum :: [Integer] -> Integer

定義

リストは「リストの先頭に要素を追加したもの」または「空リスト」だ。その2つでパターンマッチする。

空リスト

mySum [] = ...

空のリストの総和は何だろうか。[3, 8, 2]の総和は13、[8, 2]の総和は10、[2]の総和は2である。リストからひとつ数を消すとその消した数のぶんだけ総和が減少する。よって[]の総和は[2]の総和から2を引いた値0だ。空リストの総和を0とすると都合がいい。

mySum [] = 0

空でないリスト

[3, 8, 2]の総和は[8, 2]の総和に3を足したものだ。[8, 2]の総和は[2]の総和に8を足したものだ。[2]の総和は[]の総和に2を足したものだ。

mySum [3, 8, 2] == 3 + mySum [8, 2]
mySum [8, 2] == 8 + mySum [2]
mySum [2] == 2 + mySum []
mySum [] == 0

これを逆にたどればmySum [3, 8, 2]は13となる。

mySum [x1, x2, ..., x3] == x1 + mySum [x2, ..., x3]

パターン(x : xs)でマッチして先頭の要素と残りのリストをとりだす。

mySum (x : xs) = x + mySum xs

出来上がり

mySum.hs

mySum :: [Integer] -> Integer
mySum [] = 0
mySum (x : xs) = x + mySum xs

まとめ

「空リストの総和は0である」と「リストの総和は先頭の数と残りのリストの総和の和である」とを定義する。

リストでは空リストが基底となることが多く先頭の要素を落とすことで基底に近づく。

「リストのパターンマッチ」へもどる 「リストの要素の総積」へ

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