akimachoのはてなブログ

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

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

はじめに

今日は第7章 組とパターンマッチです.組ってタプル(tuple)と同じものだと思うのですがどうなんでしょうかね?

タプル - Wikipedia

Tuple - Wikipedia, the free encyclopedia

組の構文

組というのは,いくつかのデータを並べてひとつのデータにしたものです。p.50

組は要素の値をコンマで区切って表現します.要素の値はお互いに依存しません.自由に選択することができます.また,カッコで括らなくても大丈夫です.

# (3, 2) ;;
- : int * int = (3, 2)
# 3.14, "Hello" ;;
- : float * string = (3.14, "Hello")

組を使うと,2つの値の交換も簡単ですね.

パターンマッチ

パターンマッチ(パターンの照合,pattern match)を使うことで,構造データの中身を取り出すことができます.

matchwith
  パターン ->

パターンマッチは上のような形になります.具体的にはこんな感じで使います.

# let swap t = match t with
  (a, b) -> (b, a) ;;
val swap : 'a * 'b -> 'b * 'a = <fun>
# swap (0, 1) ;;
- : int * int = (1, 0)

ちなみに,(a, b)のaとbはパターン変数と呼ばれ,構造データの要素を取り出すのに使われます.

2つの記法

以下の関数add1とadd2はどちらもint * int -> int型の関数です.ですが表記法が違います.


2つの組を用いた構文
どんな違いがあるのでしょうか?

関数add2では,引数にパターンを書いているのでmatch文を省略することができます.なのでプログラムを短くすることができます.

しかし,はじめに関数の仮引数を(hoge, foo)といったように書くと,関数のインタフェースが決め打ちされてしまいます.そうなると,のちに変更があった場合に面倒です.

以上により,本書では関数の引数にパターンを書かないようです.

構造データに対するデザインレシピ

  1. 目的・・・インプット,アウトプット,関数の型の決定
  2. 例・・・関数の動きの具体例,テストケースの作成
  3. テンプレート・・・入力された構造データの中身を取り出すためのmatch文作成
  4. 本体・・・関数の実装
  5. テスト・・・期待したとおりに動いているかの確認.そうでない場合は,4にもどる

パターンマッチの実行

match 式1 with
  パターン -> 式2
  1. 式1を実行する
  2. 1の結果をパターンと照合する
  3. パターン変数をマッチした値に置き換える
  4. 式2を実行する

練習問題

だんだんOCamlにも慣れてきました.


第7章問題


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

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