English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

Browse thread
Polymorphic variant typing
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2005-02-15 (21:29)
From: Gilles Dubochet <dubochet@u...>
Subject: Polymorphic variant typing
Hello everyone,

The following O'Caml expression:
let incr g x = match x with
	| `Int i -> `Int (i+1)
	| x -> (g x);;

Receives type:
(([> `Int of int ] as 'a) -> ([> `Int of int ] as 'b)) -> 'a -> 'b

Why? I am quite astonished. I would have expected a type more like:
([> ] -> [> ]) -> [> `Int of int ] -> [> `Int of int ]

or in Wand or Rémy-like row variable notation with which I am a little 
more comfortable (I am not exactly sure the preceding type is correct 
in the 'at leat - at most' notation of O'Caml):
([ 'a ] -> [ 'b ]) -> [ `Int of int | 'a ] -> [ `Int of int | 'b ]

Could anyone be kind enough to give me some clues about where to look 
at to find an explanation or even better, explain me what is going on? 
I am particularly puzzled by the fact that the g function's *argument* 
type is 'at least `Int of int'. This rejects the following code which 
seems intuitively correct:
incr (function `Float f -> `Float (f+.1.));;

Thank you.