[
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: | Manuel Fahndrich <maf@m...> |
| Subject: | # types and polymorphic variants |
What is the meaning of #foo, when foo is a polymorphic variant set? type foo = [`A | `B | `C] I assumed that it was the following: #foo = [<`A | `B | `C ] that is a set containing at most `A | `B | `C. In other words a subtype of foo. But consider the following example. type foo = [`A | `B | `C] let foo1 (x : #foo as 'a) = x let y1 = foo1 (`A : [`A]) let foo2 (x : [< `A | `B | `C] as 'a) = x let y2 = foo2 (`A : [`A]) The complier tells me: ocamlc -c -i ex1.ml type foo = [`A|`B|`C] val foo1 : (#foo as 'a) -> 'a val y1 : foo val foo2 : ([<`A|`B|`C] as 'a) -> 'a val y2 : [`A] The first function returns me only a foo, the second function returns me [`A] as expected. Thus my question, what exactly does #foo stand for. I do understand row variables, but the issue with the lower and upper bounds > < in variant types seems new. Is there a paper describing these? I seem to write types of the form [< `A | `B | `C] a lot. Shouldn't there be an abbreviation for those as well? Maybe #<foo? Thanks in advance for such a wonderfully expressive type system! Manuel