読者です 読者をやめる 読者になる 読者になる

akimachoのはてなブログ

ICTとデザインのためのブログ

『プログラミングの基礎』読書日誌-5日目-

はじめに

いよいよデザインレシピが炸裂します.

計算をまとめる 

 ある計算を関数としてまとめることで,より多様な変更に対応することができるようになります.

OCamlの関数定義には,次の構文を用います.

let 関数名 引数 ・・・= 式 

関数の型

OCamlでは,データだけでなく関数にも型がついています.

A -> Bという型ならば,A型値を受け取ったらB型値を返す関数の型というになります.

また,A -> B -> Cという型ならば,一つ目の引数としてA型値を,二つ目の引数としてB型値を受け取ったらC型値を返す関数の型になります.

以下の文が腑に落ちませんでした.

ここに出てくるint -> int -> intがこの関数の型です。ここでA -> B -> Cは,右に結合します。つまり,(A -> B) -> CではなくA -> (B -> C)という意味です。(p.22)

(((A) -> B) -> C)のように結合していくのが左結合です.一方,(A -> (B -> (C)))というように結合していくのが右結合です.次のような関数を考えると, int -> int -> int型の関数であると評価されます.

let tasu x y = x + y 

これは数学的には

z=f\left( x,y \right)=x+y

のように表されます.2変数関数ですね.

 しかし,さきほどの右結合の考え方になると,int -> ( int -> int )

つまり,int型の値を受け取ったら,int -> int型の関数を返す関数という考え方もできます.1対1とか全単射,合成関数とも関連がありそうですね. A -> BというのがどうしてもAからBへの写像にみえてしまいます.うーむ

ちなみに,こんなふうなコードを書いてみるとOCamlの関数呼び出しはカッコなしだとエラーになってしまいました.引数が3つあると解釈されてしまうようです.

gistc1e488e8bb4ff86327e8

型推論と型チェック

型について,インタプリタが行ってくれることは

  1. 型推論
  2. 型チェック

の2つです.

型推論(Type inference)とは,プログラマが明示しなくても処理系が関数の型を推論してくれることをいいます.

型推論 - WikipediaType inference - Wikipedia, the free encyclopedia

以下の記事が分かりやすいと思います.


モダンなプログラミング言語に浸透する「型推論」 | NTTデータ

一方,型チェックとは,期待される型の値が使われているかを調べることです.間違った型のデータが渡されるのを実行前に防ぐことができます.それにより,プログラムの信頼性が向上します.

型システム - Wikipedia

Type system - Wikipedia, the free encyclopedia

関数の実行

  1. 関数呼び出しを呼び出された関数の中身で置き換え
  2. 置き換えられた関数の中身のうち引数を実引数で置き換える

の順で,関数呼び出しが評価されます.

関数定義に対するデザインレシピ

いよいよ関数を作成する際に重要なポイントをまとめたデザインレシピが登場します.

  1. 目的・・・インプット,アウトプット,関数の型の決定
  2. 例・・・関数の動きの具体例,テストケースの作成
  3. 本体・・・関数の実装
  4. テスト・・・期待したとおりに動いているかの確認.そうでない場合は,3にもどる

デザインレシピに則った関数定義を行えるWebページがありました.

http://pllab.is.ocha.ac.jp/~asai/book-mov/recipe.html

また,このデザインレシピの方法がテスト駆動開発(TDD : Test Driven Development)と似ているのでないか?ということが,次のページで考察されていました.


プログラムを書く順番とテスト駆動開発について - Line 1: Error: Invalid Blog('by Esehara' )

インタプリタからのファイル読み込み

#use "ファイル名"

を使うことで,そのファイル内のコードを読み取り順番に実行していきます.

練習問題

 デザインレシピの手順を丹念に踏んでいきます.

gistc8ea63568ff5d2e44b38

こんなの見つけました

プログラミングの基礎 (Computer Science Library)

プログラミングの基礎 (Computer Science Library)