Rozważmy następujący nonsense lambda:F # wzorzec dopasowania kuriozum
function
| [] -> "Empty list"
| hd::tl -> "Not so empty list"
To działa prawidłowo. Teraz przepisać go w następujący sposób:
function
| [] -> "Empty list"
| hd::tl & l -> "Not so empty list"
Ponownie, ze względów nonsensownych (i wiem, że mogę osiągnąć ten sam efekt przy użyciu as
zamiast &
, ale to wszystko ma do czynienia z problemem code-golf to nie dotyczy tego pytania). Teraz kompilator F # informuje mnie:
ostrzeżenie FS0025: Niepełny wzorzec pasujący do tego wyrażenia. Dla przykładu , wartość "[]" może wskazywać na przypadek nieobjęty wzorami (wzorami) .
To nie ma sensu - w pierwszej regule wyraźnie posługuję się sprawą []
. Nie widzę, co zmieniło się z pierwszej funkcji na drugą w odniesieniu do []
; żadna z drugich zasad nie pasowałaby do tego, ale tylko druga funkcja daje ostrzeżenie. Wszystko co zrobiłem, to dodać dodatkowy wzór, który pasuje do czegokolwiek, co jest.
Oczywiście wywołanie drugiej funkcji z pustą listą kończy się pomyślnie.
Czy istnieje ważny powód, dla którego to ostrzeżenie wystąpiło, lub czy sprawdzanie wzorca F # ma po prostu jakieś dziwactwa? Mogłem zauważyć, że niektóre przypadki są takie, gdy stosuje się bardziej zaawansowane wzorce, ale wydaje się to dość proste. Nawet jeśli problemu nie można rozwiązać w ogólności, wydaje się, że ten typ przypadku byłby na tyle powszechny, że zasługuje na specjalną obsługę w kompilatorze.
Nigdy nie widziałem "i" używanych w ten sposób. Czy możesz połączyć się z dokumentacją na temat tego, co to robi? – JaredPar
@JaredPar - zobacz I wzór tutaj http://msdn.microsoft.com/en-us/library/dd547125.aspx. Zasadniczo oznacza to, że możesz uzyskać głowę, ogon i całą listę za jednym razem –