我注意到我无法创建两个具有相同选项的活动模式,但我可以在没有任何警告的情况下创建两个具有相似选项的模式:
let (|A|B|C|) c =
if (c = 'a') then A
else if (c = 'b') then B
else C
let (|A|B|D|) c =
if (c = '1') then A
else if (c = '2') then B
else D
因此,当以这种方式匹配时:
let check myvar =
match myvar with
| A -> printf "match A\n"
| n -> printf "match other %A\n" n
有时候是这样的:
check 'x' // match other 'x'
check 'a' // match other 'a' !!
check '1' // match A
我有点担心会无意中覆盖现有的活动模式选项,例如,由于不同的语义上下文(如(|Direct|Indirect|)
(路由)和(|Alternating|Direct|)
(当前)),同一个词可能出现在不同的模式中。
我怎样才能避免这种情况?