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

型駆動開発

型駆動開発とは

コードを書く前に型を考える。「型から考える」コーディングを「型駆動開発」と呼ぼう。

題材

身長と体重からBMIを計算し肥満かどうか判定する。

BMIとは

BMIとは体重と身長から計算される肥満度を表す指数だ。

BMI = [体重(kg)] / [身長(m)] ^ 2

[BMIの人達の図]

日本の基準では25以上が肥満だ。

仕様

身長と体重が引き数だ。身長はcm単位とする。肥満かどうかを返り値とする。

BMIは少数点以下も意味があるので実数だ。代表的な実数はDouble型の値だ。体重、身長、BMIをDouble型の値とする。肥満かどうかはFalse値とTrue値から成るBool型の値とする。

定義する関数

BMIを求める関数bmiと結果を25と比較する関数isObeseを定義する。

bmi :: Double -> Double -> Double
isObese :: Double -> Double -> Bool

bmiは身長(Double)と体重(Double)をとってBMI(Double)を返す。isObeseは身長(Double)と体重(Double)をとって肥満かどうか(Bool)を返す。

型をさきに定義

型をさきに定義する。型の情報をGHCiでチェックする。型宣言のみでは読み込みエラーとなるのでエラー値undefinedをスタブとする。

bmi.hs

bmi :: Double -> Double -> Double
bmi = undefined

isObese :: Double -> Double -> Bool
isObese = undefined

% ghci bmi.hs
*Main> :t bmi
bmi :: Double -> Double -> Double
*Main> :t isObese
isObese :: Double -> Double -> Bool

関数を呼び出すとエラーとなる。

*Main> bmi 172 66
*** Exception: Prelude.undefined
*Main> isObese 172 66
*** Exception: Prelude.undefined

トップダウンかボトムアップか

トップダウンとボトムアップにはそれぞれ利点・欠点がある。

[トップダウンの図] [ボトムアップの図]

トップダウンでは全体の構成がわかりやすい。それぞれの部品が果たす役割が明確だ。反面、実装について十分に考慮しないと部品を作るときに二重化等の無駄が出る。ボトムアップでは汎用の部品が作られる。流用できるものとなり仕様の変更に強い。反面、全体のなかでの役割を配慮しないと全体に組みこむときに手直しが必要になる。

BMIの例では関数isObeseをさきに作ればトップダウンな開発だ。関数bmiをさきに作ればボトムアップな開発だ。isObeseをさきに作るときは「bmiが適切に定義されているならば」と仮定する。この仮定は再帰関数を作るときにも必要になる。

関数isObeseの定義

「関数bmiがBMI値を返すならば」関数isObeseはそれが25以上かどうかを返す。

bmi.hs

isObese h w = bmi h w >= 25

関数bmiの定義

関数bmiは身長(h)と体重(w)からBMIを計算する。身長はcmからmに変換する。100分の1にする。

bmi.hs

bmi h w = w / (h / 100) ^ 2

試してみる

*Main> :reload
*Main> isObese 172 70
False
*Main> isObese 172 80
True

「型宣言」へもどる 「モジュールの読み込み」へ

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