union

なんかやっと union の話なのか。なんか enum の方と似たような定義するわりには割と別の物体というか。要は C でよくやる

struct VALUE {
  int type;
  union {
    int i;
    float f;
    char* s;
  } val;
}

みたいなのを両方一気に定義できちゃう、みたいなそんなノリ。上のコードはスクリプト言語の型情報つきの変数みたいなものの定義のつもりです。んでこれもスーパー switch 文と言ってた match 文で漏れがあったらエラー出してくれるので割とハッピー。

type value = Int of int | Str of string
let print_value v =
  match v with
  | Int i -> Printf.printf "int %d\n" i
  | Str s -> Printf.printf "str %s\n" s
let _ =
  let iv = Int 2
  and sv = Str "hoge" in
  print_value iv;
  print_value sv

これはなんか適当にサンプルコードとか書いてみた次第です。えーとつまりなんか値取り出す時は match 文使わんと取り出せないわけですな。 C の上記のコードなんかを思い返すと、 switch (type) した中でしか val は使わない気がするので、非常に合理的というか。なるほどなあと。あとなんかパターンマッチは when とか使うとさらになんか色々便利だったり。

んでコンストラクタとかいうらしいんですが、 Int 2 とか Str "hgoe" とかすると value 型が作れると。ここで重大な問題がありましてですね、 Int とか Str は関数として扱えないらしくて、なんかとても不便な感じなのですけどねこれ。なんじゃこれ。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h