2016-04-07 1 views
0

Muss ich eine explizite Übereinstimmungserklärung verwenden, um ihren Platzhalterwert zu identifizieren?Muss ich eine explizite Übereinstimmungserklärung verwenden, um ihren Platzhalterwert zu identifizieren?

Nehmen wir zum Beispiel die folgende Funktion:

let (|Positive|Neutral|Negative|) = function 
    | x when x > 0 -> Positive 
    | x when x = 0 -> Neutral 
    | x when x < 0 -> Negative 
    | _   -> failwith (sprintf "unknown: %d" _) 

Fehler:

Unexpected symbol '_' in expression

ich gelernt, dass ich dies ohne Fehler tun können:

let (|Positive|Neutral|Negative|) v = 
    match v with 
    | x when x > 0 -> Positive 
    | x when x = 0 -> Neutral 
    | x when x < 0 -> Negative 
    | _   -> failwith (sprintf "unknown: %d" v) 

UPDATE

Hier ist das Ergebnis aus einer Antwort geschrieben:

let (|Positive|Neutral|Negative|) = function 
    | x when x > 0 -> Positive 
    | x when x = 0 -> Neutral 
    | x when x < 0 -> Negative 
    | x   -> failwith (sprintf "unknown: %d" x) 
+1

Denken Sie an Strich als ignorieren/verwerfen. Es ist ein spezielles Symbol, dem nie ein Wert zugewiesen werden kann (außer vielleicht von einer anderen .NET-Sprache?) – TheQuickBrownFox

+0

Es ist ein absolut gültiger Bezeichner für Variablen, Methoden usw. in C#. Diese besondere Bedeutung ist einzigartig für F #. (VB.NET lässt Sie offenbar auch nicht als Kennung verwenden, obwohl diese Art von Mustererkennung nicht vorhanden ist.) – TeaDrivenDev

Antwort

2

Sie können es auf diese ändern und es wird funktionieren:

let (|Positive|Neutral|Negative|) = function 
    | x when x > 0 -> Positive 
    | x when x = 0 -> Neutral 
    | x when x < 0 -> Negative 
    | f   -> failwith (sprintf "unknown: %d" f) 
+0

Danke. Ich habe gelernt, dass ich einfach die Wildcard komplett entfernen kann und einfach f –

+0

yeah habe ich total vermisst, als ich es geschrieben habe – kemiller2002

Verwandte Themen