Given these types
type a = [ `A ]
type b = [ a | `B | `C ]
and this function
let pp: [< b] -> string =
function | `A -> "A"
| `B -> "B"
| `C -> "C"
applying a value of type a
works without issue, as expected:
let a: a = `A
let _ = pp a
However, if the function is modified to include a wildcard pattern
let pp: [< b] -> string =
function | `A -> "A"
| `B -> "B"
| _ -> "?"
even though everything else remains the same, it now yields the following error (on let _ = pp a
):
This expression has type b -> string but an expression was expected of type a -> 'a Type b = [ `A | `B ] is not compatible with type a = [ `A ] The second variant type does not allow tag(s) `B
Questions:
- Why is it no longer able to accept a subtype? I understand the wildcard means it now CAN accept a supertype, but that shouldn't mean it MUST.
- Is there some way of getting around this, to avoid having to enumerate a million or so variants that aren't relevant?
:>
though, I didn't realize it could be used for poly-variants too! – Belgian