Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

module constraints bug? #2863

Closed
vicuna opened this issue Jul 28, 2001 · 1 comment
Closed

module constraints bug? #2863

vicuna opened this issue Jul 28, 2001 · 1 comment
Labels

Comments

@vicuna
Copy link

vicuna commented Jul 28, 2001

Original bug ID: 455
Reporter: administrator
Status: closed
Resolution: not a bug
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)

Bug description

Dear all,

There seems to be a bug in the way o'caml handling higher-order modules
with constrained module arguments. Consider the following module types:

module type T =
sig
type t
end

module type SELF =
sig
module Self: T
end

module type F =
sig
module A: T

module Eta: functor (X: SELF with module Self = A) ->
sig
  val t2t: X.Self.t -> X.Self.t
end

end

In module type F, one specifies a functor Eta that takes in an argument X
containing a module Self. Self is to have the same implementation of module A,
which is also specified in F.

However, the following module ThisF cannot be type-checked by ocaml
to have module type F:

module ThisF: F =
struct
module A =
struct
type t = Pink | Blue
end

module Eta = functor (X: SELF with module Self = A) ->
struct
  let t2t x = match x with A.Pink -> A.Blue | A.Blue -> A.Pink
end

end

The error message is reproduced below:

...	

Modules do not match:
functor(X : sig module Self : sig type t = A.t = | Pink | Blue end end) ->
sig val t2t : A.t -> A.t end
is not included in
functor(X : sig module Self : sig type t = A.t end end) ->
sig val t2t : X.Self.t -> X.Self.t end

...

Type declarations do not match:
type t = A.t
is not included in
type t = A.t = | Pink | Blue

However, if we change the module constraint to a type constraint
in the definition of Eta, as shown below in module ThatF,
then it will type-check.

      module ThatF: F =
      struct
        module A = 
        struct
          type t = Pink | Blue
        end

(* here *) module Eta = functor (X: SELF with type Self.t = A.t) ->
struct
let t2t x = match x with A.Pink -> A.Blue | A.Blue -> A.Pink
end
end

Is this a bug or am I missing something?

The above is simplied code. In real code, I have many modules
defined in the module type SELF, and each of these module again defines
several parametric type constructors. So it is quite tedious
to spell out all the type constraints.

best,
Tyng-Ruey Chuang

@vicuna
Copy link
Author

vicuna commented Jul 30, 2001

Comment author: administrator

This is how "SIG with module A = B" works.

@vicuna vicuna closed this as completed Jul 30, 2001
@vicuna vicuna added the bug label Mar 19, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant