そういえばメインマシンには OCaml が入ってたような気がする。
~ % ocaml aamine@harmony Objective Caml version 3.06 #
いた。
そうだ、聞きそびれたやつを試そう。 同じコンストラクタを複数のバリアント型に使ったらどっちに型推論されるのか。
# type fruit = Apple | Banana | Orange;; type fruit = Apple | Banana | Orange # type corp = Apple | DEC | Intel | Sun;; type corp = Apple | DEC | Intel | Sun # Apple;; - : corp = Apple
後のやつか。でもこれは対話型だからのような気もするなあ。 ファイルに書いて別々の型に推論できるようにしたらどうなるんだ。
~/c/test/ocaml % cat variant.ml aamine@harmony type fruit = Apple | Banana | Orange type corp = Apple | DEC | Intel | Sun let f t = function | Apple -> 1 | Banana -> 2 | Orange -> 3 let g t = function | Apple -> 4 | DEC -> 5 | Intel -> 6 | Sun -> 7 let () = Printf.printf "%d - %d\n" (f Apple) (g Apple) ~/c/test/ocaml % ocaml variant.ml aamine@harmony File "variant.ml", line 6, characters 6-12: This pattern matches values of type fruit but is here used to match values of type corp
エラーですかそうですか。 明示的に型を書けば通りそうな気もするが文法がわかんね。
(06:02)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
そのエラーも「Apple」がcorp型なので起きてるエラーで、そういうときには多相バリアントてのを使います。
type fruit = [ `Apple | `Banana | `Orange ]
type corp = [ `Apple | `DEC | `Intel | `Sun ]
let f = function | `Apple -> 1 | `Banana ->2 | `Orange -> 3
let g = function | `Apple -> 4 | `DEC -> 5 | `Intel ->6 | `Sun ->7
let _ = Printf.printf "%d - %d\n" (f `Apple) (g `Apple)
- データ構成子の先頭にバッククォートをつける
- 型宣言時には前後に[]をつける
なるほどー! 多相バリアントという名前だけは
聞いたことがありますが、こういうときに使うんですね。
ありがとうございます。