Browse thread
Oddness with recursive polymorphic variants
- Jeremy Yallop
[
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: | -- (:) |
| From: | Jeremy Yallop <j.d.yallop@s...> |
| Subject: | Oddness with recursive polymorphic variants |
I have two polymorphic variant types, as follows:
type f = [`A | `B of f]
type g = [f | `C]
Next, I have a function from f to g:
let s1 : f -> g = function
| `A -> `A
| `B b -> b
Sadly, the compiler rejects this:
Characters 57-58:
| `B b -> b;;
^
This expression has type f but is here used with type g
The first variant type does not allow tag(s) `C
The error message seems odd. Why should it matter that g has more tags
than f, since every value of f is a value of g (by definition)?
Indeed, minor variants of the function are accepted. Both of the
following are ok:
let s2 : f -> g = function
| `A -> `A
| `B (#f as b) -> b
let s3 : f -> g = function
| `A -> `A
| `B ((`A|`B _) as b) -> b
Am I missing something, or is this a bug?
Thanks,
Jeremy.