Il problema con il vostro codice è che quando si scrive:
match x with
| y when x < y -> (...)
.. vuol dire che si desidera assegnare il valore della x
(il <expr>
in match <expr> with
) per una nuova variabile denominata y
(la <pat>
in | <pat> when ...
) e quindi confrontare questo nuovo (che ora contiene il valore di x
) con il valore di x
- e quindi restituirà sempre false
. È sempre possibile rinominare la variabile legata, in modo che il codice è lo stesso di scrittura:
match x with
| newY when x < newY -> (...)
Ora si può vedere perché questo non corrisponde - perché si sta solo confrontando x
con se stessa!
pattern matching è particolarmente utile se si dispone di ingressi di qualche struttura più complicata - come tuple o unioni discriminati, liste, array, tipi di opzioni ecc Ma se si vuole semplicemente confrontare i numeri, è molto più facile usare solo if
:
let test x y =
if x < y then printfn "less than"
elif x > y then printfn "greater than"
else printfn "equal"
Nella tua match
, non si ha realmente bisogno di legare tutte le variabili - ma la soluzione da John dimostra come si può fare quel lavoro - dice semplicemente, prendere variabili x
e y
e assegnarli a nuove variabili x
e y
(che hanno lo stesso nome).
fonte
2013-09-06 03:58:17
Approccio interessante Gene. –