Ich stieß heute auf eine Kuriosität in der F # -Mustervergleichssyntax, die zu offensichtlichen Fehlern bei der Vollständigkeitsprüfung führen kann.Ambiguität in Mustervergleichssyntax
type Thing =
| This
| That
| Other
let useThing =
function
| This -> "A"
| That -> "A"
| That -> "B" // compiler complains
| Other -> "B"
In dem obigen Szenario sagt mir der Compiler hilfreich, dass die zweite Regel nie übereinstimmen wird. Allerdings, wenn ich versucht hätte, den Code ein wenig kompakter zu machen und geschrieben hatte
let useThing =
function
| This | That -> "A"
| That | Other -> "B"
Ich bekomme keine Hilfe vom Compiler. Ich denke, der Grund ist, dass | This | That ->. "A"
keine Abkürzung für | This -> "A" | That -> "A"
ist, auch wenn es sehr ähnlich aussieht (und ich habe viele Code-Beispiele gesehen, die es so behandeln). Stattdessen wird das Pipe-Symbol von dem, was ich finden kann, sowohl zum Trennen einzelner Muster als auch als OR-Muster verwendet.
Dies ist kein großes Problem für die meisten DUs, aber ich stieß auf das Problem, wenn ich ein DU mit einer großen Anzahl von Fällen in ein anderes DU mit einer kleinen Anzahl von Fällen abbildete. Mein Versuch, die Shortcut-Syntax zu verwenden, verursachte einen Fehler.
Also meine Fragen sind:
- Ist meine Interpretation richtig?
- Gibt es eine Umgehungslösung abgesehen von der Auflistung jedes Musters in einer separaten Zeile?