無差別に技術をついばむ鳥

情報処理技術全般を気まぐれにつつくゆるいブログです

OCamlをつつく12−バリアント型。潜在能力は未知数!

今回はvariant型をつつくピヨ♪バリアント型というのは値に名前をつけたものピヨッ♪
じゃあ、早速プログラムにしてつついてみるピヨ♪


# 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はオブジェクト指向言語だからコンストラクタは型のようなもので、値(インスタンス)は別に存在するピヨ。それを考えたら値と表現したのは間違っていたピヨ。なので、コンストラクタはメタデータと考えてね。
別窓 | OCaml | コメント:3 | トラックバック:0 | ∧top | under∨
<<LISP関連記事の目次 | 無差別に技術をついばむ鳥 | LISPをつつく3−値の評価。思わぬ効果が・・・>>

この記事のコメント

それは値じゃなくてコンストラクタ(あるいはタグ)ですね。

type 型名 = コンストラクタ1 [of 型1] | コンストラクタ2 [of 型2] | ...

あえてそう表現されているのかもしれませんが、だとしても正式名称も併記してほしいところです。
2008-11-13 Thu 12:09 | URL | いげ太 #-[ 内容変更]
いげ太さん有難う
正式名で説明を書くとイメージが湧き難いと思って値にしたんだけど、確かに正式名は必ず書いておくべきですね。
後で追加します。
2008-11-13 Thu 13:46 | URL | インドリ #-[ 内容変更]
ふつうのプログラマ的には、「コンストラクタ」というと OOP の方のアレを想起してしまいますからね。僕も最初は混乱しました(笑)けど逆に「クラスのコンストラクタと、バリアントのコンストラクタはなにが違うんだ?」みたいなことを考えてみるのもまたたのしかったり。
わかりやすさのためとはいえ、なんの注釈もなくオレオレ用語で説明してしまうのはどうかなーと思いコメントさせてもらいました。型定義に値が書ける、と説明してしてしまうのも、なんかそれはそれでまた混乱しそうな気がしますし(^^;
2008-11-13 Thu 14:08 | URL | いげ太 #-[ 内容変更]
∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

この記事のトラックバック

∧top | under∨
| 無差別に技術をついばむ鳥 |