2010-04-24 2 views

Antwort

27

Nutzungseinheit für leeren Nebeneffekt:

match list with 
    | [] -> printfn "Empty!" 
    | _ ->() 
+2

Wo „()“ ist der Wert, vom Typ "Einheit", und "Einheit" ist der Rückgabetyp von "printfn", etwas wie "void". – Brian

+0

Perfekt, danke! –

+0

Kann ich es für leere While-Schleife verwenden? – fahadash

14

Die Antwort von Stringer ist natürlich , richtig. Ich dachte, es könnte nützlich sein zu erklären, wie das funktioniert, denn "()" ist nicht wirklich eine leere Aussage oder leere Nebenwirkung ...

In F #, ist jedes gültige Stück Code ein Ausdruck. Konstrukte wie let und match bestehen aus einigen Schlüsselwörtern, Mustern und mehreren Unterausdrücken. Die F # Grammatik für let und match sieht wie folgt aus:

<expr> ::= let <pattern> = <expr> 
      <expr> 
     ::= match <expr> with 
      | <pat> -> <expr> 

Dies bedeutet, dass der Körper von let oder der Körper der Klausel match müssen einige Ausdruck sein. Es kann ein Funktionsaufruf wie ignore 0 oder ein Wert sein - in Ihrem Fall muss es ein Ausdruck des Typs unit sein, weil printfn ".." auch vom Typ unit ist.

Der Typ unit ist ein Typ, der nur einen Wert hat, der als () geschrieben wird (und auch leeres Tupel ohne Elemente bedeutet). Dies ist tatsächlich etwas ähnlich zu void in C# mit der Ausnahme, dass voidkeine Werte hat.

BTW: Der folgende Code wie eine Folge von Anweisungen aussehen, aber es ist auch ein Ausdruck:

printf "Hello " 
printf "world" 

Der F # -Compiler fügt implizit ; zwischen den beiden Linien und ; ist ein Sequenzierungs Operator, der hat die folgende Struktur: <expr>; <expr>. Es erfordert, dass der erste Ausdruck unit zurückgibt und das Ergebnis des zweiten Ausdrucks zurückgibt.

Dies ist ein wenig überraschend, wenn Sie aus C# Hintergrund kommen, aber es macht die Sprache überraschend elegant und konsistent. Es ist nicht, dass Sie in keiner Weise einschränken - Sie zum Beispiel schreiben:

if (a < 10 && (printfn "demo"; true)) then // ... 

(Dieses Beispiel nicht wirklich nützlich ist - nur eine Demonstration der Flexibilität)