ふつける 6 章

ふつける 6 章 p.128。基本的な値とかリテラルとか。

まずは Bool 型。代表的な関数として、not と (&&) と (||) がある。これはどれも同じ名前で OCaml にもある。(&&) や (||) は関数なのに右辺が評価されたりされなかったりしてずるい。(||) と全く同じことをする関数として or があるが、マニュアルを見るとこれは Deprecated となっている。たぶん、and と or が対になっていないのが気持ち悪かったんだろう。あと、(&&) と同じ (&) という関数もあるが、これも Deprecated だ。

次に数値。整数には Int と Integer がある。 Int が小さい整数で、Integer が制限のない整数。OCaml には組込みの int とか Int32 とか Int64 とか Nativeint とかあって何がなんやら。制限のない整数を扱うには num ライブラリの Big_int を使うのか。しかも (+) とか (*) の演算子は int にしか使えないので不便。

# 5l + 7l;;
This expression has type int32 but is here used with type int

でゅあ。

文字と文字列。文字列は文字のリスト。

タプル。fst と snd は OCaml といっしょ。SML では #n hoge という形で n 番目の要素を取り出せる。

- #1 (1,2,3);
val it = 1 : int
- #3 ("HOGE",3,[1,2,3]);
val it = [1,2,3] : int list

0 からではなく 1 からだ。というか、# はレコードの要素を取り出すのに使う

- #foo { foo = "FOO" }; (* OCaml の { foo = "FOO" }.foo と同じ。*)
val it = "FOO" : string

のだが、タプルはレコードの一種なので同じように # が使えるのである。

- {1=1,2="2"};
val it = (1,"2") : int * string

ラベルが 1,2,… となっているレコードがタプルとなる。ただし、{1=1} はタプルにはならない。要素が一つしかないタプルというのは存在しないからだ。番号がとんだりしてもダメ。要素が一つもないレコードあるいはタプルは unit 型の唯一の値となる。まとめると、次のようになる。

- {1="1"}; (* 要素が一つなのでタプルにならない *)
val it = {1="1"} : {1:string}
- {1=1,2="2",3=[1,2,3]}; (* タプル *)
val it = (1,"2",[1,2,3]) : int * string * int list
- {1=1,4=7}; (* 番号がとんでいる *)
val it = {1=1,4=7} : {1:int, 4:int}
- {};
val it = () : unit
- {} = ();
val it = true : bool

Haskell にもどろう。zip と unzip は OCaml の List.combine と List.split にほぼ等しいが、リストの長さが違ったときに zip は短いほうに合わせられるのに対し List.combine は 例外が発生する点が異なる。

# List.combine [1;2;3] [4;5];; (* OCaml *)
Exception: Invalid_argument "List.combine".

Prelude> zip [1,2,3] [4,5] -- Haskell
[(1,4),(2,5)]

OCaml のエラーメッセージはどうにかならんのか。

次はリスト。cons は :: でなく (:) 。ちょうど OCaml と逆になっている。リストが空リストがどうか調べる null 関数は SML のと一緒。OCaml にこれにあたるものが無いのはとほほだ。lst = [] とかちょっとなあ。(++) 関数は OCaml の (@) と同じ。文字列に対しては (^) だ。
リスト内包表記は新鮮。map や filter の組合せを簡潔に書ける。数学の集合の表記法に似せてあるんだな。多分。show 関数は値を文字列に変換する関数。これはいい。OCamlRuby の p みたいなことをしたかったのだが、なかなか難しかった。これが使えればちょっとはいい具合になるだろうなあ。Camlp4 とか Obj とか使えばできないこともなさそうだが…。Camlp4 は全然わからんのでどうにかしたいところだ。

6 章終わったー。明日は 7,8 章行くぞ。