OCamlをつつく12-バリアント型。潜在能力は未知数!
じゃあ、早速プログラムにしてつついてみるピヨ♪
# type boolean = True | False;;
type boolean = True | False
let get_boolean x = if x = 0 then True else False;;
val get_boolean : int -> boolean =
# get_boolean 0;;
- : boolean = True
# get_boolean 1;;
- : boolean = False
つまり・・・
type 名前 = 値1 | 値2 | ・・・
という風に書くのがバリアント型なんだ。 こんな具合に使用するピヨ♪今のサンプルでは命令言語の列挙対と似ているピヨ。OCamlでは値は必ず先頭が大文字でなくてならないから注意してね♪
でもOCamlは複雑なフランス女性(妄想)。これはバリアント型の一面でしかないピヨ。先ほどの例は全てが定数の特殊なバリアント型なんだ。
じゃあ、普通のバリアント型はどんなのかというと・・・
# type types = Int of int | Float of float |
Char of char | String of string |
Bool of bool | Unit of unit;;
type types =
Int of int
| Float of float
| Char of char
| String of string
| Bool of bool
| Unit of unit
※紙面上の都合で途中で改行しているピヨ。
つまり、こんな風に・・・
type 名前 = 値1 of 型名 | 値2 of 型名 | ・・・
宣言するピヨ♪で、肝心な使い方なんだけどぉ・・・ パターンマッチという機能でよく使用するピヨ。だから、残念だけど使用法についての説明は今後するピヨ。ごめんね。
追記
正確さがなかったので追記するピヨ。いげ太さんがいった通りで、上記で値と書いてあるものを正確に書くとconstructor(コンストラクタ)というんだ。コンストラクタというとC++とかのコンストラクタと同じと思って混乱する人が居ると思うけどこれは別物ピヨ。コンストラクタというのは構築子という意味だから、オブジェクト指向言語ではオブジェクトを構築するためのメソッドとしてコンストラクタと読んでいるピヨ。一方OCamlの方はオブジェクトを構成する要素としてコンストラクタとして呼んでいるとボクは思うピヨ。
ちなみに、ボクが値と呼んだのはちゃんと理由があっての事なんだ。マニュアルに「バリアント型の宣言は、その型の値が取りうる形を全て並べ立てます。」て書いてあるし、全てが定数の場合のサンプルだったからね。あと、関数型言語では全てのものがシンボルであり、値そのものだからなんだ。命令型言語では分類しているから関数とオブジェクトは別のものなんだけど、LISPとかの関数型言語で引数に関数をとる関数が普通に使えるのはそういった考え方の違いからなんだ。
だけど、OCamlはオブジェクト指向言語だからコンストラクタは型のようなもので、値(インスタンス)は別に存在するピヨ。それを考えたら値と表現したのは間違っていたピヨ。なので、コンストラクタはメタデータと考えてね。