Browse thread
Polymorphic variant typing
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ 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. Cheers, Gilles.