Я пишу простой синтаксический анализатор выражений на F#, и для каждого оператора я хочу поддерживать только определенное количество операндов (например, два по модулю, три для If). Вот что у меня есть:
type Operator =
| Modulo
| Equals
| If
let processOperator operands operator =
match operator with
| Modulo ->
match operands with
| [ a:string; b:string ] -> (Convert.ToInt32(a) % Convert.ToInt32(b)).ToString()
| _ -> failwith "wrong number of operands"
| Equals ->
match operands with
| [ a; b ] -> (a = b).ToString()
| _ -> failwith "wrong operands"
| If ->
match operands with
| [ a; b; c ] -> (if Convert.ToBoolean(a) then b else c).ToString()
| _ -> failwith "wrong operands"
Я хотел бы избавиться или упростить совпадения внутреннего списка. Каков наилучший способ добиться этого? Должен ли я использовать несколько охранников?