プログラミングの基礎

# したいこと
[プログラミングの基礎](http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E5%9F%BA%E7%A4%8E-Computer-Science-Library-%E6%B5%85%E4%BA%95/dp/4781911609/ref=pd_bxgy_14_img_y)を通して、コンピュータサイエンスの基礎となるアルゴリズムとデータ構造、また正しいプログラミングの知識を身につける。

# 第１章 - はじめに
[OCamlをインストールする](http://qiita.com/shinyashikis@github/items/842cc0ddd1e1bc0f3487)

# 第２章 - 基本的なデータ
## 整数と実数
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
```

# 第３章 - 変数の定義

## 変数
変数名の先頭は小文字、変数の定義は `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
```

# 第４章 - 関数の定義
## 関数定義の構文
関数の定義は `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」

```lang:calc_time.ml
(* 目的：距離と早さから時間を求める *)
let calc_time dist time = 0
```

### 例
実装するまえにテストをかく

```lang:calc_time.ml
(* テスト *)
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
```

### 本体
実際に実装する

```lang:calc_time.ml
(* 目的：距離と早さから時間を求める *)
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
```

### 完成形

```lang:calc_time.ml
(*目的：距離と早さから時間を求める *)
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
```

# 第５章 - 条件分岐
## 条件分岐の構文

```
if 条件 then 式 else 式
```

## 関数でのつかいかた

```lang:taikei.ml
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 ""
```

返却パターンもすべてテストとして網羅すること

```lang:taikei.ml
(* テスト *)
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
```


第６章 - さまざまなエラー
第７章 - 組とパターンマッチ
第８章 - レコード
第９章 - リスト
第１０章 - 再帰関数を使ったプログラミング
第１１章 - 自然数と再帰
第１２章 - ダイクストラのアルゴリズム
第１３章 - 一般化と高指関数
第１４章 - 高指関数を使ったリスト処理
第１５章 - 新しい形の再帰
第１６章 - 情報の蓄積
第１７章 - 再帰的なデータ構造
第１８章 - 例外と例外処理
第１９章 - モジュール
第２０章 - モジュールの開発
第２１章 - 逐次実行
第２２章 - 値の書き換えと参照透過性
第２３章 - 副作用命令を使ったプログラミング
第２４章 - まとめ―プログラミングとは