2014-03-13 11 views
8

ich F # bin neu und noch nicht überall gesehen, wie die folgenden richtigMustervergleich mehrerer Variablen

let fun1 a b = 
match a b with 
| a + b > 0 -> fun2 
| a + b < 0 -> fun3 

ich tun dies mit Pattern-Matching-tun Hausaufgaben, aber ich weiß nicht, wie man es richtig macht. Ich dachte, ich könnte Tupel wie folgt verwenden:

let fun1 (a,b) = 
match (a,b) with 
| (a,b) when a + b > 0 -> fun2 
| (a,b) when a + b < 0 -> fun3 

Aber das funktioniert nicht auch. Wie gehe ich vor?

Antwort

11

Sie haben die richtige Idee, Sie haben nur vergessen, dass Einzug in F # zählt. Hinzufügen von Räumen macht Lösung Arbeit:

let fun1 (a,b) = 
    match (a,b) with 
    | (a,b) when a + b > 0 -> fun2 
    | (a,b) when a + b < 0 -> fun3 

dies tatsächlich Muster passt zweimal, so könnten wir es neu schreiben wollen:

let fun1 t = function 
    | (a,b) when a + b > 0 -> fun2 
    | (a,b) when a + b < 0 -> fun3 

Der Compiler/Interpreter lässt dies gehen, aber mit einer Warnung:

Warnung FS0025: Unvollständige Musterübereinstimmung für diesen Ausdruck.

Ich lasse davon bekommen :-)

als Übung befreien

PS. Schön von dir, dass du Hausaufgaben machen kannst.

+0

Das ist ein dummer Fehler war! Danke vielmals! –

+0

Sehr willkommen.Achten Sie darauf, auch unten auf kvs Antwort zu schauen, die gute Punkte hat, die ich nicht gemacht habe. –

9

Søren Debois ist korrekt. Hier sind ein paar andere Hinweise:

  1. a und b sind bereits in Umfang, so müssen Sie nicht gegen sie übereinstimmen, können Sie gegen alles passen:

    let fun1 (a,b) = 
        match() with 
        |() when a + b > 0 -> fun2 
        |() when a + b < 0 -> fun3 
    
  2. Aus diesem Grund , eine Verwendung einer if-Anweisung könnte idiomatischer sein.

  3. Sie vermissen eindeutig den Fall, wenn a + b = 0; Beachten Sie, dass der Compiler immer davon ausgeht, dass eine when-Klausel möglicherweise nichts abdeckt. Daher erhalten Sie immer noch eine Warnung, dass einige Fälle möglicherweise nicht behandelt werden, selbst wenn Sie einen |() when a + b = 0 -> ...-Fall hinzufügen. Sie müssten stattdessen nur |() -> ... oder | _ -> ... tun.

  4. Es gibt eine integrierte Verknüpfung für Definitionen der Form let f <pattern> = match <same pattern> with |..., die let f = function |... ist. Sie würden es gerne nutzen:

    let fun1 = function 
    | (a,b) when a + b > 0 -> fun2 
    | ... 
    

    Beachten Sie, dass jetzt a und b werden nicht durch die Funktionsdefinition gebunden, so die Idee von meiner ersten Note nicht gilt, und Sie müssen sie in das Muster einzuführen.

+0

Danke, das hilft mir, meinen Code besser aussehen zu lassen! –

2

Sie im Match-Klausel hinzufügen:

let fun2() =() 
let fun3() =() 
let fun1 a b = 
    match (a+b) with 
     | res when res > 0 -> fun2 
     | res when res < 0 -> fun3 
     | _ -> raise (new System.NotImplementedException()) 

Abdeckung alle Fälle von Ihrem Muster, als gute Praxis :-)

+1

Guter Anruf, der auf der Summe anstelle des Tupels zusammenpasst. – mydogisbox