したいこと
プログラミングの基礎を通して、コンピュータサイエンスの基礎となるアルゴリズムとデータ構造、また正しいプログラミングの知識を身につける。
第1章 - はじめに
第2章 - 基本的なデータ
整数と実数
OCamlでは整数と実数を分けて考える
そのまま計算するとエラーとなる
# 2 * 3.14 ;;
Error: This expression has type float but an expression was expected of type
int
整数と(小数点以下がない場合も)四測演算子にもピリオドを付与する
# 2. *. 3.14 ;;
- : float = 6.28
べき乗
べき乗は「**」
3.14の2乗
# 3.14 ** 2. ;;
- : float = 9.8596
文字列
文字列は「"」で囲み、文字列連結は「^」
# "あいう" ^ "えお" ^ "かきく" ^ "けこ" ;;
- : string = "あいうえおかきくけこ"
論理演算
&&「かつ」
||「または」
not「否定」
# true && true ;;
- : bool = true
# true || false ;;
- : bool = true
# not true ;;
- : bool = false
第3章 - 変数の定義
変数
変数名の先頭は小文字、変数の定義は let 変数名 = 式
# let e = 2.7182 ;;
val e : float = 2.7182
OCamlインタプリタの実行順
# let e = 2.7182 ;;
val e : float = 2.7182
# 1.0 +. e *. 2.0 ;;
- : float = 6.4364
1.0 + e × 2.0
↓
1.0 + 2.7182 × 2.0
↓
1.0 + 5.4364
↓
6.4364
第4章 - 関数の定義
関数定義の構文
関数の定義は let 関数名 引数 ... = 式
# let calc x = x * 2 ;;
val calc : int -> int = <fun>
複数の引数の場合はスペースをあける
# let calc x y = x * 2 + y * 3 ;;
val calc : int -> int -> int = <fun>
上記の関数の型は
int -> int -> int
関数の呼び出しは "関数名 引数"
# calc 5 8 ;;
- : int = 34
デザインレシピ
プログラム作成時にしたがうべき指針となるもの
- 目的
- 例
- 本体
- テスト
目的
作成する関数が何をするものなのか、入力と出力は何なのかを考え関数の型を決めてヘッダを作成する
例.距離と早さから時間を求める関数「calc_time」
(* 目的:距離と早さから時間を求める *)
let calc_time dist time = 0
例
実装するまえにテストをかく
(* テスト *)
let test1 = calc_time 10 1 = 10
let test2 = calc_time 15 5 = 3
let test3 = calc_time 20 10 = 2
テストの実行は #use "テスト対象" ;;
# #use "calc_time.ml" ;;
val calc_time : 'a -> 'b -> int = <fun>
val test1 : bool = false
val test2 : bool = false
val test3 : bool = false
本体
実際に実装する
(* 目的:距離と早さから時間を求める *)
let calc_time dist time = dist / time
テスト
正しく動作することを確認する
# #use "calc_time.ml" ;;
val calc_time : int -> int -> int = <fun>
val test1 : bool = true
val test2 : bool = true
val test3 : bool = true
完成形
(*目的:距離と早さから時間を求める *)
let calc_time dist time = dist / time
(* テスト *)
let test1 = calc_time 10 1 = 10
let test2 = calc_time 15 5 = 3
let test3 = calc_time 20 10 = 2
第5章 - 条件分岐
条件分岐の構文
if 条件 then 式 else 式
関数でのつかいかた
let hosomi = "細身"
let futsuu = "普通"
let futome = "太め"
(* 目的:体重を与えたら男性の体型を返す *)
(* taikei : int -> string *)
let taikei taiju =
if taiju < 55 then hosomi
else if 55 <= taiju && taiju < 75 then futsuu
else if taiju >= 75 then futome
else ""
返却パターンもすべてテストとして網羅すること
(* テスト *)
let test1 = taikei 54 = hosomi
let test2 = taikei 55 = futsuu
let test3 = taikei 56 = futsuu
let test4 = taikei 74 = futsuu
let test5 = taikei 75 = futome
let test6 = taikei 80 = futome
第6章 - さまざまなエラー
第7章 - 組とパターンマッチ
第8章 - レコード
第9章 - リスト
第10章 - 再帰関数を使ったプログラミング
第11章 - 自然数と再帰
第12章 - ダイクストラのアルゴリズム
第13章 - 一般化と高指関数
第14章 - 高指関数を使ったリスト処理
第15章 - 新しい形の再帰
第16章 - 情報の蓄積
第17章 - 再帰的なデータ構造
第18章 - 例外と例外処理
第19章 - モジュール
第20章 - モジュールの開発
第21章 - 逐次実行
第22章 - 値の書き換えと参照透過性
第23章 - 副作用命令を使ったプログラミング
第24章 - まとめ―プログラミングとは