OCaml

多相性と書き換え可能データ

プログラミング in OCaml メモ

8.2.4 多相性と書き換え可能データ

ここのところの記述と実際がちょっと違っていたので、メモしておく。

「まずは空リストへの参照を定義します。」とあって、以下のコードが示されている。

# let x = ref [];;
val x : 'a list ref = {contents = []}

「参照x に格納されているのは空リストですので、さまざまな型とのコンスができます。」

とあって、

# (2 :: !x, true :: !x);;
- : int list * bool list = ([2], [true])

という実行例が提示されているが、実際は、以下のようなエラーが出る。
(OCaml 4.05.0)

Error: This expression has type int list but an expression was expected of type bool list
Type int is not compatible with type bool

これは、「2 :: !x」 が int list なのに、「true :: !x」 が bool list だと言っているのだろう。

したがって、以下のようにするしかないかな。

let x = ref [];;
val x : '_a list ref = {contents = []}

let y = ref [];;
val y : '_a list ref = {contents = []}

(2 :: !x ,true :: !y);;
- : int list * bool list = ([2],[true])