Si consideri il seguente lambda assurdità:F # pattern matching stranezza
function
| [] -> "Empty list"
| hd::tl -> "Not so empty list"
Questo funziona bene. Ora riscrivo come segue:
function
| [] -> "Empty list"
| hd::tl & l -> "Not so empty list"
Anche in questo caso, per motivi senza senso (e so che posso ottenere lo stesso effetto utilizzando as
invece di &
, ma tutto questo ha a che fare con un problema di codice-golf che è non pertinente a questa domanda). Ora il compilatore F # mi dice:
avviso FS0025: corrispondenze modello incompleta su questa espressione. Nell'esempio , il valore '[]' potrebbe indicare un caso non coperto dai motivi .
Questo non ha alcun senso - Sto gestendo esplicitamente il caso di []
nella prima regola. Non vedo cosa è cambiato dalla prima funzione alla seconda rispetto allo []
; la seconda regola di nessuna funzione l'avrebbe uguagliata, ma solo la seconda funzione dà l'avvertimento. Tutto ciò che ho fatto è stato aggiungere un motivo aggiuntivo che corrisponda a , qualsiasi cosa.
Ovviamente, il richiamo della seconda funzione con una lista vuota ha esito positivo.
C'è un motivo valido per cui si è verificato questo avviso o la convalida del modello F # ha semplicemente qualche stranezza? Potrei vedere alcuni casi come questo quando si usano schemi più avanzati, ma questo sembra piuttosto semplice. Anche se il problema non può essere risolto in generale, sembra che questo tipo di caso sia abbastanza comune da meritare una gestione speciale nel compilatore.
non ho mai visto '&' usato in quel modo. Puoi collegare ad alcuni documenti su cosa fa? – JaredPar
@JaredPar: vedere AND pattern qui http://msdn.microsoft.com/en-us/library/dd547125.aspx. Fondamentalmente significa che puoi ottenere la testa, la coda e l'intera lista in un colpo solo. –