1

できないようです。

なぜできないのか理解したい。

確かにできるtype 'a entry = Empty | Value of string * 'a * 'a entry;;ので、再帰的に型を定​​義したいのなら、unionルートしか行けませんか?

4

2 に答える 2

6

使用したくないタイプについてのみ言及しているため、質問は混乱を招きます。ただし、タイトルから、直接再帰型を使用したいことがわかります。

直接再帰型が必要な場合は-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つの理由です。

于 2013-03-24T14:19:27.180 に答える
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

しかし、この場合、これはおそらく役に立たないでしょう。なぜなら、どうやってそれを終わらせることができるのでしょうか?

于 2013-03-24T19:01:00.303 に答える