Несколько F#, когда охранники используют шаблоны группировки при сопоставлении с образцом

почему этот код не работает и как заставить его работать?

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

Итак, возможно ли иметь несколько охранников в группах шаблонов?


person Oldrich Svec    schedule 28.07.2010    source источник


Ответы (1)


У вас может быть только один охранник на стрелу/результат, поэтому что-то вроде этого будет работать:

let id1 = 0

match p1, p2 with
| Fluid, Particle id2
| Interface _, Particle id2 when id1 = id2 -> doSomething()
| _ ->  doSomething()

(обратите внимание, что в этом случае оба элемента в или должны связывать один и тот же набор идентификаторов, чтобы в любом случае ни один идентификатор не оставался неинициализированным)

или, альтернативно, добавьте второе действие/результат:

match p1, p2 with
| Fluid, Particle id2 when id1 = id2 -> doSomething()
| Interface _, Particle id2 when id1 = id2 -> doSomething()
| _ ->  doSomething()
person Robert    schedule 28.07.2010
comment
Спасибо за Ваш ответ. Полезно знать, что защита when действительна для всех случаев в группе шаблонов. - person Oldrich Svec; 28.07.2010