I'd like to add that this a good systematic way to avoid confusing error messages when dealing with polymorphic variants (or objects). Just add type annotations on variables and function parameters which are polymorphic variants (or objects).
Here only one extra annotation would be needed, on the heading value:
val mutable heading : dir = `Up
method flip_heading = ...
method get_direction (x : dir) = ...
method get_heading = ...
The error message becomes closer to the actual error:
File "toto.ml", line 15, characters 15-61:
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
(`West|`South|`North|`East)
Martin
On 09/10/2015 02:13 AM, Edouard Evangelisti wrote:
Dear Martin,
In your example, heading is not of type dir.
However, this would work :
val mutable heading : dir = `Up
Regards,
Edouard
2015-09-10 10:07 GMT+01:00 Martin DeMello <martindemello@gmail.com
<mailto:martindemello@gmail.com>>:
I'm not sure exactly why this doesn't work:
type dir = [`North | `South | `East | `West | `Up | `Down]
let index = function
| `North -> 1
| `South -> 2
| `East -> 3
| `West -> 4
| `Up -> 5
| `Down -> 6
class foo = object(self)
val mutable heading = `Up
method flip_heading =
heading <- match heading with `Up -> `Down | `Down -> `Up
method get_direction (x : dir) = index x
method get_heading = self#get_direction heading
end
it fails with
File "test.ml <http://test.ml>", line 28, characters 42-49:
Error: This expression has type [ `Down | `Up ]
but an expression was expected of type dir
The first variant type does not allow tag(s)
`East, `North, `South, `West
but why is that an error? I'd think that any function that accepts
type dir should accept type [`Down | `Up] as well. Also, how do I
get this to work?
martin