プログラミングの基礎のデザインレシピ
デザインレシピ
関数定義に対するデザインレシピ(26ページ)
目的
例
本体
テスト
条件分岐に対するデザインレシピ(38ページ)
例
本体(1)
本体(2)
構造データに対するデザインレシピ(64ページ)
テンプレート
入力が構造データの場合は、その中身を取り出すmatch文を作る
データ定義に対するデザインレシピ
データ定義
入力データの型、出力データの型を考える。もし、それらの型が構造を持つならその型を定義する。意味のあるかたまりに対してひとつの型を定義するのが望ましいプログラミングスタイルです。
再帰関数に対するデザインレシピ(82ページ)
データ定義
目的
例
テンプレート
本体
テスト
アキュムレータに対するデザインレシピ(170ページ)
本体
再起的なデータ構造に対するデザインレシピ(183ページ)
データ定義
テンプレート
関数定義に対するデザインレシピ (26ページ)
関数定義に対するデザインレシピ
目的
例
本体
テスト
よくあるUnitTestフレームワークと比べると簡易的だけど、シンプルなのが良い
関数の「目的」と「型(上述の例にあたる?)と「テスト」を記述し、「本体」はひとまずダミー実装で良い。
code:kyuyo.ml
(* 目的:働いた時間 x に応じたアルバイト代を計算する *)
(* kyuyo : int -> int *)
let kyuyo x = 0
(* Test *)
let test1 = kyuyo 0 = 100
let test2 = kyuyo 25 = 23850
let test3 = kyuyo 28 = 26700
kyuyo.mlをutopから読み込む。本体がダミー実装なので、test1からtest3はすべて失敗(false)になる。
code:ocaml
val kyuyo : 'a -> int = <fun>
val test1 : bool = false
val test2 : bool = false
val test3 : bool = false
関数の本体をちゃんと実装する。
code:kyuyo.ml
(* 時給(円)*)
let jikyu = 950
(* 基本給(円)*)
let kihonkyu = 100
(* 目的:働いた時間 x に応じたアルバイト代を計算する *)
(* kyuyo : int -> int *)
let kyuyo x = x * jikyu + kihonkyu
(* Test *)
let test1 = kyuyo 0 = 100
let test2 = kyuyo 25 = 23850
let test3 = kyuyo 28 = 26700
kyuyo.mlをutopから再度読み込む。今度はすべてのテストが成功(true)になる。
code:ocaml
val jikyu : int = 950
val kihonkyu : int = 100
val kyuyo : int -> int = <fun>
val test1 : bool = true
val test2 : bool = true
val test3 : bool = true
構造データに対するデザインレシピ(54ページ)
テンプレート
入力が構造データの場合は、その中身を取り出すmatch文を作る