Version française
Home     About     Download     Resources     Contact us    
Browse thread
Closed variants, type constraints and module signature
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Philippe Veber <philippe.veber@g...>
Subject: Closed variants, type constraints and module signature
I'd like to define a type with a variable that is constrained to accept only
polymorphic variant types included in a given set of tags. That is how I
believed one should do :

        Objective Caml version 3.11.2

# type 'a t = 'a constraint 'a = [< `a | `b ];;
type 'a t = 'a constraint 'a = [< `a | `b ]


But I stumbled upon the following problem, when trying to use this
definition


# module type S = sig
  val v : 'a t
end;;
module type S = sig val v : [< `a | `b ] t end

# module I : S = struct
    let v = `a
  end;;

  Error: Signature mismatch:
       Modules do not match: sig val v : [> `a ] end is not included in S
       Values do not match:
         val v : [> `a ]
       is not included in
         val v : [< `a | `b ] t

Does anyone know why the definition of module I is rejected ? And if this is
the intended behavior, why does the following work ?

# let v : 'a t = `a
  ;;
val v : [< `a | `b > `a ] t = `a


Philippe.