Version française
Home     About     Download     Resources     Contact us    
Browse thread
'a & string unification issue
[ 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] 'a & string unification issue
From: Alessandro Baretta <a.baretta@studio.baretta.com>

> I'm back to my usual tuareg-mode session, and I'm back to my usual typing 
> trouble. Does the following error message, coming from a fresh installation of 
> ocaml 3.09.2, make any sense.
> 
> Values do not match:
>    val init :
>      [< `Odbc_driver of
>           [< `Default
>            | `Options of
>                [< `DSN of string ] * [< `User of string ] *
>                [< `Password of string ] ]
>       | `Pgsql_driver of
>           [< `Default
>            | `Options of
>                [< `Client_encoding of string
> 
> (* The problem seems to be here: shouldn't 'x & string unify trivially *)
> (* for any type variable 'x? *)
Indeed, so this is probably not the problem
>                 | `DB of 'a & string
>                 | `Debug_log of 'b & string
>                 | `Debug_options of 'c & string
>                 | `Host of 'd & string
>                 | `Hostaddr of 'e & string
>                 | `Password of 'f & string
>                 | `Port of 'g & int
>                 | `SSL of 'h & string
>                 | `User of 'i & string ]
>                list
>            | `String of string
The next line seems to be the problem:
>            > `Options ] ] ->
>      [> `Odbc_driver of Odbc_driver.pipeline
>       | `Pgsql_driver of Pgsql_driver.pipeline ]
> is not included in
>    val init :
>      [< `Odbc_driver of
>           [< `Default
>            | `Options of
>                [ `DSN of string ] * [ `User of string ] *
>                [ `Password of string ] ]
>       | `Pgsql_driver of
>           [< `Default
>            | `Options of
>                [< `Client_encoding of string
>                 | `DB of string
>                 | `Debug_log of string
>                 | `Debug_options of string
>                 | `Host of string
>                 | `Hostaddr of string
>                 | `Password of string
>                 | `Port of int
>                 | `SSL of string
>                 | `User of string ]
>                list
>            | `String of string ] ] ->
>      [> `Odbc_driver of Odbc_driver.pipeline
>       | `Pgsql_driver of Pgsql_driver.pipeline ]

Looks like your implementation contains at least `Options, while the
interface doesn't. Since it is in a contravariant position, you should
be able to remove it from the implementation by subtyping.

Jacques Garrigue