鉴于这些类型
type a = [ `A ]
type b = [ a | `B | `C ]
和这个功能
let pp: [< b] -> string =
function | `A -> "A"
| `B -> "B"
| `C -> "C"
正如预期的那样,应用类型的值a
没有问题:
let a: a = `A
let _ = pp a
但是,如果修改函数以包含通配符模式
let pp: [< b] -> string =
function | `A -> "A"
| `B -> "B"
| _ -> "?"
即使其他一切都保持不变,它现在会产生以下错误(on let _ = pp a
):
此表达式的类型为 b -> 字符串,但预期的表达式类型为 a -> 'a Type b = [ `A | `B ] 与类型 a = [ `A ] 不兼容 第二个变体类型不允许标记 `B
问题:
- 为什么它不再能够接受子类型?我理解通配符意味着它现在可以接受超类型,但这不应该意味着它必须。
- 有没有办法解决这个问题,以避免枚举一百万左右不相关的变体?