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 回答