## Programming problems and weird error messages

### Can I have two mutually recursive compilation units / structures /
signatures / functors?

No, unfortunately. This would raise serious typing and compilation
problems. Some workarounds are explained in the user manual.

### How do I express sharing constraints?

Use manifest type specifications in the arguments of the
functor. For instance, assume defined the following signatures:
module type S1 = sig ... type t ... end
module type S2 = sig ... type u ... end

To define a functor `F`

that takes two arguments
`X:S1`

and `Y:S2`

such that `X.t`

and
`Y.u`

share, write:
module F (X: S1) (Y: S2 with type u = X.t) =
struct ... end

Internally, this expands to
module F (X: S1) (Y: sig ... type u = X.t ... end) =
struct ... end

On this form, it is clear that `F`

can only be applied to
structures `A`

and `B`

that meet the
specifications, i.e. such that `B.u`

is provably equivalent
to `A.t`

. Moreover, given the declaration of the functor
argument `Y`

, the body of the functor can assume that
`B.u = A.t`

. Therefore, this works exactly like a sharing
constraint.

### Compilation units are forced to be structure. What if I want to make
a unit with a functor or a signature instead?

In Objective Caml, functors and signatures (module types) can be
components of structures. So, just make the functor or signature be a
component of a compilation unit. A good example is the module
`Set`

from the standard library.

### It says ```
this expression has type t but is here used with
type t
```

. I'm confused. Isn't this the same type?

It is the same type name, but not necessarily the same type.
Two type constructors can have the same name, but
actually represent different types. See the user manual.

### What is this business about type variables that cannot be
generalized?

The simplest solution to the long-standing problem of polymorphic
references. See the
user manual.
A more detailed
explanation
(in the context of Caml Light 0.7) can be found in the Caml FAQ, and
in the Caml mailing
list.

Caml -
Objective Caml -
Projet Cristal -
Homepages -
Contact the Caml maintainers

*Author: Xavier Leroy* --
*Last modified: *1999/02/09