Version française
Home     About     Download     Resources     Contact us    
Browse thread
Interpretation of an error message "type ('a, 'b) t should be ('a, 'c) t" in a signature?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Jacques Garrigue <garrigue@m...>
Subject: Re: [Caml-list] Interpretation of an error message "type ('a, 'b) t should be ('a, 'c) t" in a signature?
This is exactly the same problem as your previous post.
You are trying to define a non-regular type.
I.e., if you expand the definition of job, you get:

  type ('a,'b) batch = private
    < build : < create_batch : 'c.('a -> 'c) -> ('a,'c) batch; .. > ->
              ('a priority * 'a) list ->
              < create_batch : 'c.('b -> 'c) -> ('b,'c) batch; .. > ;
    .. >
(not a correct definition because job itself is a private row type,
 but this is just to show explicitly the occurences of batch)

All occurences of batch inside its own definition should have the same
parameters ('a,'b), but here both have different parameters.
I admit that the error message is a bit confusing because all
parameters are variables, and their names are not preserved by the
type-checker. If the name were preserved, this would be
       type ('a, 'c) batch should be ('a, 'b)

Jacques Garrigue

From: Jean Balthazar <jean.balthazar.fr@gmail.com>
> I try to define the signature of three interdependant classes that should
> then be derived and completed for various implementation. The code below
> causes the strange error messsage:
> 
>          File "tmp.ml", line 4, characters 7-92:
>          In the definition of job, type ('a, 'b) batch should be ('a, 'c)
> batch
> 
> Can you explain what is wrong with this signature?
> I was unable to find an answer to a similar problem in the archives.
> 
> Thank you very much.
> Jean
> 
> ----------------------------------------------------------------------------
> 
> module type JOB =
> sig
> 
>   type ('a, 'b) batch =  private < build : 'a job -> ('a priority * 'a) list
> -> 'b job; .. >
>   and 'b priority = private < next : 'b priority;  ..  >
>   and 'a job =  private < create_batch : 'c.('a -> 'c) -> ('a, 'c) batch;
> ..  >
> 
> end