4

Haskell では、次のことができます。

Prelude> data Foo = Foo Bar; data Bar = Bar Foo

OCaml で同じことを行うにはどうすればよいでしょうか? 私は試した:

                    ___
# type foo = Foo of bar;; type bar = Bar of foo;;
Error: Unbound type constructor bar

OCamlで相互に再帰的なデータ型を定義することさえ可能ですか? そうでない場合、なぜですか?

let 式とデータ定義の比較: 相互に再帰的なデータ型は using に対応しますlet rec(または、より適切なtype rec言い回しが必要な場合はより適切です)。相互に再帰的なデータ型を定義できる利点は何ですか? 私のfoobarの例は些細なことです。相互に再帰的なデータ型の自明ではない使用法を思いつきますか?

4

2 に答える 2

12

使用するand

type foo = Foo of bar
 and bar = Bar of foo
于 2015-04-06T13:04:05.070 に答える
4

ivgあなたの質問に答えましたが、これは重要な相互再帰型です。

module Stream = struct

  type 'a t    = unit -> 'a node
   and 'a node = Nil
               | Cons of 'a * 'a t 

end

これは、正真正銘のスパイン レイジー ストリームです。とはいえ、相互に再帰的な型なしで構築できます

type 'a t = Stream of (unit -> ('a * 'a t) option)

私の考えでは、必要に応じて相互再帰型のファミリをいつでも単一の型に減らすことができます (ただし、OCaml ではおそらくそうではありません。私が考えているエンコーディングでは、従属型インデックスが自明ではありません)。確かに直接より明確にすることができます。

于 2015-04-06T13:28:54.960 に答える