できないようです。
なぜできないのか理解したい。
確かにできるtype 'a entry = Empty | Value of string * 'a * 'a entry;;
ので、再帰的に型を定義したいのなら、union
ルートしか行けませんか?
できないようです。
なぜできないのか理解したい。
確かにできるtype 'a entry = Empty | Value of string * 'a * 'a entry;;
ので、再帰的に型を定義したいのなら、union
ルートしか行けませんか?
使用したくないタイプについてのみ言及しているため、質問は混乱を招きます。ただし、タイトルから、直接再帰型を使用したいことがわかります。
直接再帰型が必要な場合は-rectypes
、コマンドラインをオンにする必要があります。ただし、これはほとんどの場合、本当にやりたいことではありません。それは本当にあなたが望むものではないあまりにも多くのタイプを許可します。
$ ocaml
OCaml version 4.00.0
# type 'a entry = string * 'a * 'a entry;;
Error: The type abbreviation entry is cyclic
# ^D
$ ocaml -rectypes
OCaml version 4.00.0
# type 'a entry = string * 'a * 'a entry;;
type 'a entry = string * 'a * 'a entry
#
デフォルトで有効になっていない理由-rectypes
は、実際にコーディングエラーである多くの式に型を指定できるためです。結局のところ、追加の柔軟性は、追加のエラー検出をあきらめる価値はありません。
これは私が古いOCamlメーリングリストメッセージで見つけた例です:
$ ocaml -rectypes
OCaml version 4.00.0
# let f x = x :: x;;
val f : ('a list as 'a) -> 'a list = <fun>
#
-rectypes
オンにすると、このかなりばかげた機能が受け入れられます。しかし実際には、それはかなり奇妙なリストタイプでのみ機能します。ほとんどの場合、プログラマーは、ではなくを使用してリストを自分自身に追加することを意図していました。残念ながら、このエラーは、がオンになるまでずっと検出されません。@
::
-rectypes
補足として、そしてnewacctが指摘しているように、タイトルのタイプはそれほど有用ではないことにすぐに気付くでしょう。実際には、循環構造または無限構造のみを表すことができます。-rectypes
これは、なしで作業することがそれほど難しくないもう1つの理由です。
を実行すると、Cのaのようにtype something = another type
、タイプの同義語typedef
を実行します。これにより、別のタイプを参照するためのショートカットとして使用できるエイリアスが作成されます。それ自体は新しいタイプを定義しません。したがって、再帰的にすることはできません。
を実行するtype something = SomeContructor of ...
と、新しい代数的データ型が定義されます。これは再帰的になる可能性があります。
(HaskellとSMLはこれについてより明確です。type
タイプの同義語に使用し、data
(Haskell)/ datatype
(SML)を使用して新しい代数的データ型を定義します。)
代数的データ型は、必ずしも複数の選択肢を持つ必要はありません。構文的に有効です
type 'a entry = Value of string * 'a * 'a entry
しかし、この場合、これはおそらく役に立たないでしょう。なぜなら、どうやってそれを終わらせることができるのでしょうか?