2016-08-04 6 views
4

ich eine einfache Funktion wollen, die den entgegengesetzten Wert geben - Rückkehr v2 wenn v == v1; return v1 wenn v == v2. Ich habe versucht, die folgenden:f # Muster den entgegengesetzten Wert übereinstimmen

let oppose v v1 v2 = 
    match v with 
    | v1 -> v2 
    | v2 -> v1 
    | _ -> "" 

Aber ich die Warnungen erhalten:

warning FS0026: This rule will never be matched 
warning FS0026: This rule will never be matched 

Und es funktioniert nicht wie erwartet:

> oppose "a" "a" "b" 
val it : string = "b" 
> oppose "b" "a" "b" 
val it : string = "b" 

Ich würde erwarten, bekommen "a" im zweiten Anruf. Was mache ich falsch?

Antwort

3

Die Namen in der Match-Klausel verwendeten Namen zu dem Ergebnis zugeordnet ist, nicht geprüft, gegen den Wert. Sie müssen explizit überprüfen:

let oppose v v1 v2 = 
    match v with 
    | a when a = v1 -> v2 
    | b when b = v2 -> v1 
    | _ -> "" 

Sie auch if anstelle eines Spiels verwenden können. Dies kann einfacher zu lesen, wenn Sie gegen Werte sind überprüft, wie in diesem Fall:

let oppose v v1 v2 = 
    if v = v1 then v2 
    elif v = v2 then v1 
    else "" 
+3

Vielleicht sollten Sie die if/elif/else Weg, es zu tun, fügen die als Spiel fit besser ist in diesem Fall, Wie @Nafu scheint zu beginnen, es ist F # Reise? – Sehnsucht

+1

@Sehnsucht Sure;) einfach genug um hinzuzufügen –

+1

Danke! Nie zuvor als "es" bezeichnet :) – nafu

Verwandte Themen