Betrachten Sie die folgende Unsinn Lambda:F # Musterabgleich Kuriosität
function
| [] -> "Empty list"
| hd::tl -> "Not so empty list"
Dies funktioniert gut. Jetzt habe ich es wie folgt umschreiben:
function
| [] -> "Empty list"
| hd::tl & l -> "Not so empty list"
Auch für Unsinn Gründen (und ich weiß, dass ich durch die Verwendung as
statt &
die gleiche Wirkung erzielen können, aber dies alles mit einem Code-Golf-Problem zu tun hat, das ist für diese Frage nicht relevant). Jetzt der F # Compiler sagt mir:
Warnung FS0025: Unvollständige Muster passt auf diesen Ausdruck. Für Beispiel kann der Wert '[]' einen Fall anzeigen, der nicht durch die Muster abgedeckt ist.
Das ergibt keinen Sinn - ich behandle ausdrücklich den Fall []
in der ersten Regel. Ich sehe nicht, was sich von der ersten Funktion zur zweiten in Bezug auf []
geändert hat; Die zweite Regel von function hätte es nicht erreicht, aber nur die zweite Funktion gibt die Warnung aus. Alles, was ich tat, war ein zusätzliches Muster, das alles entspricht.
Natürlich ist der Aufruf der zweiten Funktion mit einer leeren Liste erfolgreich.
Gibt es einen triftigen Grund, warum diese Warnung aufgetreten ist, oder hat die F # Mustervalidierung einfach einige Macken? Ich könnte sehen, einige Fälle wie diese zu haben, wenn fortgeschrittenere Muster verwendet werden, aber das scheint wie ein ziemlich einfaches. Selbst wenn das Problem nicht allgemein gelöst werden kann, scheint es, als ob diese Art von Fall häufig genug wäre, um eine besondere Behandlung im Compiler zu verdienen.
ich habe nie '' '' auf diese Weise gesehen. Kannst du mit einer Dokumentation darüber verlinken? – JaredPar
@ JaredPar - siehe AND Muster hier http://msdn.microsoft.com/en-us/library/dd547125.aspx. Grundsätzlich bedeutet es, dass Sie Kopf, Schwanz und die gesamte Liste in einem Rutsch bekommen können –