3

Chris Okasaki の Purely Functional Data Structures のデータ構造のいくつかを実装する OCaml をいじっていたところ、この型定義に出くわしました。

 type tree = Node of int * int * tree list;;

ユニオン型ではないのでタグは必要ないと思ったので、タグを削除してみましたが、次のエラーが発生しました。

# type tree = int * int * tree list;;
Characters 5-33:
type tree = int * int * tree list;;
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: The type abbreviation tree is cyclic

一見同等に見える 2 つの型定義で、なぜこのようなことが起こるのでしょうか?

4

2 に答える 2

8

ML に似た言語では、再帰型の定義は、再帰がバリアント型を通過しないものです。これは、より有用な型チェックにつながる傾向があるという意味で、実用的な定義です。

再帰型について扱いにくいものは何もありません。-rectypesフラグを使用して、OCaml で再帰型のサポートを有効にできます。

$ ocaml -rectypes
        OCaml version 4.02.1

# type tree = int * int * tree list;;
type tree = int * int * tree list
# let x: tree = (3, 3, [(4, 4, [])]);;
val x : tree = (3, 3, [(4, 4, [])])

再帰型が有効になっている場合、通常の強力な型指定の保証はすべて存在します。主な欠点は、多くの意図しないプログラムが受け入れられることです。つまり、再帰型の存在は、多くの場合、プログラミング エラーを示しています。

于 2015-10-03T20:41:01.727 に答える