当模式匹配中使用分组模式的守卫时,F#是多重的

Old*_*vec 3 f# pattern-matching

为什么这段代码不起作用,以及如何使它工作?

let id1 = 0
match p1, p2 with
  | Fluid, Particle id2 when id = id2
  | Interface _, Particle id2 when id = id2 -> doSomething()
  ...
Run Code Online (Sandbox Code Playgroud)

那么在模式组中有几个守卫可能会有几个?

Rob*_*ert 8

每个箭头/结果只能保护一个,所以这样的东西可以工作:

let id1 = 0

match p1, p2 with
| Fluid, Particle id2
| Interface _, Particle id2 when id1 = id2 -> doSomething()
| _ ->  doSomething()
Run Code Online (Sandbox Code Playgroud)

(请注意,在这种情况下,或者必须绑定同一组标识符中的两个项目,以便在任何一种情况下都不会保留未标识的标识符)

或者添加第二个动作/结果:

match p1, p2 with
| Fluid, Particle id2 when id1 = id2 -> doSomething()
| Interface _, Particle id2 when id1 = id2 -> doSomething()
| _ ->  doSomething()
Run Code Online (Sandbox Code Playgroud)