Browse thread
Question on Variant Types
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Jacques Garrigue <garrigue@m...> |
| Subject: | Re: [Caml-list] Question on Variant Types |
On 6/29/06, Seth J. Fogarty <sfogarty@gmail.com> wrote: > If you have time, I have one more question I can't seem to solve. Which > quite possibly has as simple an answer as the other two. You've been very > helpful so far, and I don't want to impose, so feel free to let me know if > you've not the time. > > type foo = [`A of int | `B | 'D of foo] > type bar = [`A of int | `C of foo * bar | 'D of bar] > > let rec occurs i x = > match x with > |`A j -> i = j > |`C (foo, bar) -> (occurs i foo) or (occurs i bar) > |_ -> false > > I would like occurs to work on bars and foos. But as it is, occurs won't > work on either, because it assigns the `C variant the type "`C of 'b * 'b". > Even if I spell out `D and `B, I cannot get it to accept. As long as foo and bar are two subtypes of a common type, you can still solve the problem by defining that type and using subtyping: type foobar = [`A of int | `B | `C of foobar * foobar | `D of foobar] let occurs_foo i x = occurs i (x : foo :> foobar) let occurs_bar i x = occurs i (x : bar :> foobar) Jacques Garrigue