Wie kann ich eine no-op-Anweisung in F # schreiben?F # Wie schreibe ich eine leere Anweisung
Insbesondere, wie kann ich verbessern die zweite Klausel der folgenden Spiel Anweisung:
match list with
| [] -> printfn "Empty!"
| _ -> ignore 0
Wie kann ich eine no-op-Anweisung in F # schreiben?F # Wie schreibe ich eine leere Anweisung
Insbesondere, wie kann ich verbessern die zweite Klausel der folgenden Spiel Anweisung:
match list with
| [] -> printfn "Empty!"
| _ -> ignore 0
Nutzungseinheit für leeren Nebeneffekt:
match list with
| [] -> printfn "Empty!"
| _ ->()
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 void
keine 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)
Wo „()“ ist der Wert, vom Typ "Einheit", und "Einheit" ist der Rückgabetyp von "printfn", etwas wie "void". – Brian
Perfekt, danke! –
Kann ich es für leere While-Schleife verwenden? – fahadash