Non credo che ci sia una risposta chiara a questa domanda. In primo luogo, il caso evidente di pattern matching è quando è necessario distruggendo, ad esempio:
let rec sum = function
| [] -> 0
| head :: tail -> head + sum tail;;
Un altro caso evidente è quando si sta definendo una funzione ricorsiva, pattern matching rendere la condizione bordo più chiaro, ad esempio:
let rec factorial = function
| 0 -> 1
| n -> n * factorial(n - 1);;
invece di:
let rec factorial = function n ->
if n = 0 then
1
else
n * factorial(n-1);;
che potrebbe non essere un grande esempio, basta usare la vostra immaginazione per capire le condizioni dei bordi più complesse! ;-)
In termini di regolari (ad esempio C Come) lingue, potrei dire che si dovrebbe usare il pattern matching, invece di switch
/case
e if
al posto del l'operatore ternario. Per tutto il resto è una specie di zona grigia, ma la combinazione di modelli è solitamente preferita nella famiglia di lingue ML.
fonte
2011-09-24 03:08:42
La risposta accettata di seguito sembra buona nella maggior parte dei casi. Tuttavia, come nella maggior parte dei linguaggi di programmazione (tutti?), Raramente è una buona idea dire qualcosa sulla falsariga di 'if condition then true else false'; puoi invece usare solo 'condizione'. In questo caso, puoi dire "lascia foo a = (a = [])" ed evitare entrambe le corrispondenze di pattern e if. –