Dieser Text ist eine kostenlose Übersetzung einer Reihe von Sacha Barber- Artikeln aus Brighton, Großbritannien , die ich interessant genug fand.Dies ist der erste Beitrag in meiner F # -Serie. Also, was werden wir abdecken? Wie viele Programmierer gut wissen, ist es üblich, mit dem Hello World-Beispiel zu beginnen.
Also werden wir genau das tun. Also, ohne weiteres, was Sie brauchen, um eine separate Anwendung "Hello World" in F # zu erstellen.
Hier ist es:
open System [<EntryPoint>] let main argv = printfn "Hello World" Console.ReadLine() |> ignore 0
// Leider konnte ich die Codezuordnung für F # nicht findenDies scheint nicht genug zu sein, um darüber zu diskutieren, aber es gibt bereits etwas zu beachten, um in einige der Prinzipien von F # einzutauchen.
Was genau passiert hier?
Da dies eine separate Anwendung ist, benötigen wir natürlich einen Einstiegspunkt (genau wie für jede andere .NET-Sprache).
Wie wird der Einstiegspunkt bestimmt?
Nun, es ist fast dasselbe wie bei anderen .NET-Sprachen. Wir haben eine Main-Methode (oder eine Funktion in der F # -Terminologie), die ein String-Array verwendet, und wir verwenden das Attribut [], um anzugeben, dass die Methode mit diesem Attribut ist Einstiegspunkt.
Der Compiler und Visual Studio lieben uns dafür.
Auch in diesem Beispiel sollten Sie Alarmglocken oder zumindest ein Gefühl von Missverständnissen hören. Wir haben also gesagt, dass es eine Anfangsfunktion gibt, die ein Array vom Typ String akzeptiert. Ich sehe nur eine Variable namens "argv", die ich nicht als Array deklariert sehe. Diese "argv" -Variable ist offensichtlich das erwartete String-Array, aber warum hat es keinen Typ ... Mmm, interessant.
F # hat ein sehr gutes Typinferenzsystem, was bedeutet, dass Sie den Typ in vielen Fällen überhaupt weglassen können und F # ihn korrekt ausgibt. Natürlich können Sie den Typ der Eingabevariablen immer noch vollständig deklarieren, wenn Sie möchten, wo er normalerweise die Form annimmt
(Variablenname: Variablentyp)Wenn wir das obige Beispiel "argv" nehmen, könnten wir stattdessen das obige Programm wie folgt deklarieren, und das wäre schön:
open System [<EntryPoint>] let main (argv :string[]) = printfn "Hello World" Console.ReadLine() |> ignore 0
Sie sehen, wir haben den Namen der Eingabevariablen mit ihrem Typ vollständig definiert. In diesem Fall handelt es sich um ein Array von Zeichenfolgen [].
Was interessiert es sonst noch? Nun, wie gesagt, es gibt etwas zu besprechen.
Warum habe ich eine Zeile mit diesem seltsamen
|> am Ende
ignorieren . Was ist das?
Da dies eine F # -Konsolenanwendung ist, wollte ich, dass die Anwendung nicht heruntergefahren wird, bis der Benutzer ein Zeichen eingibt. Also muss ich zwei Dinge tun:
- Öffnen Sie den Namespace "System", mit dem ich die Namespace-Typen "System" verwenden kann, so als würde ich "using System" in C # oder "Imports System" in VB .NET verwenden. "
- Da F # eine funktionale Sprache ist, wird es sich beschweren, wenn die Funktion, in diesem Fall "Console.ReadLine (...)", die eine Zeichenfolge zurückgeben kann, das Ergebnis nicht weiter an die Funktion "Ignorieren" weitergibt, was tatsächlich return () bedeutet (dies ist der Weg in F # sagen Sie void, aber es heißt Unit). Dies weist F # ausdrücklich an, das Ergebnis des Aufrufs der Console.ReadLine (..) -Methode zu ignorieren.
Hier ist zum Beispiel, wie der Code aussehen wird, wenn ich mich entscheide, |> nicht einzuschließen

Der C # / VB.NET-Programmierer sieht möglicherweise nicht, was hier gesagt wird. Aber F # ist ziemlich schwierig, was eine Funktion kann und was nicht. Und eine Sache, die eine Funktion IMMER tun SOLLTE, ist, ein Ergebnis zurückzugeben. Im Fall der "Haupt" -Funktion ist das erwartete Ergebnis ein ganzzahliger Wert von 0.
Aber was ist mit Console.ReadLine (..)?
Nun, zumindest in diesem Fall spielt das Ergebnis keine große Rolle, und wir sind nicht daran interessiert, und das Programm funktioniert immer noch einwandfrei, wenn wir
|> ignorieren überspringen. Wenn Sie jedoch wirklich nicht an dem Ergebnis interessiert sind, sollten Sie lernen,
|> ignorieren zu verwenden . Nur für den Fall, dass Sie interessiert sind, leitet der Pipeline-Operator "|>" den Rückgabewert des linken Ausdrucks an die rechte Funktion weiter. In diesem Fall entspricht dies
"den Rückgabewert von Console.Readline (...) akzeptieren und ignorieren, wie sich niemand darum kümmert". Machen Sie sich keine Sorgen, wenn Ihnen dies zu diesem Zeitpunkt nichts bedeutet. Wir werden später mehr darüber sprechen.
Das Letzte, was ich tun muss, ist sicherzustellen, dass die F # -Funktion immer einen Wert zurückgibt. Dies geschieht in der Zeile, in der Sie nur die Zeile 0 sehen. Dies reicht aus, damit F # versteht, dass dies der Rückgabewert „0“ ist, den das Typinferenzsystem darstellt wird ausgegeben, dies ist ein Int-Wert von 0. Der Grund, warum der F # -Compiler weiß, dass dies ein Rückgabewert ist, ist, dass es in diesem Fall die letzte Anweisung ist, also MUSS es ein Rückgabewert sein. Offensichtlich kann dies durch Verwendung einer bedingten Logik kompliziert werden, wenn usw. Es ist wichtig zu beachten, dass in F # die Funktion IMMER einen Wert zurückgeben SOLLTE. In diesem Fall wird sie als Rückgabewert verwendet, da der Wert 0 Int die letzte gefundene Zeichenfolge war (obwohl alles komplizierter sein könnte). Natürlich können Sie Unit zurückgeben, was mit "()" erfolgt, was tatsächlich nichts zurückgibt (ungültig, wenn Sie möchten).
Eine andere Sache, die ich in diesem trivialen Beispiel erwähnen möchte, ist, dass Leerzeichen eine Schlüsselrolle bei der Entwicklung von F # spielen.
Angenommen, mein triviales Beispiel sah in einem Editor (in meinem Fall Visual Studio 2012) so aus:

Dies ist ein winziges Programm, und alles, was ich getan habe, war, die Leerzeichen am Anfang der printfn-Zeile zu entfernen. Mmmm, es sieht so aus, als hätte der F # -Compiler das überhaupt nicht gemocht. Ja, das ist fair.
In F # ist ein Leerzeichen SEHR SEHR wichtig. Spielen Sie also gut damit. Andernfalls gewöhnen Sie sich daran, kryptische Fehler wie den oben gezeigten zu debuggen, die durch ein einfaches Problem mit einem falschen semantischen Speicherplatz verursacht werden.
Auf jeden Fall ist dies ein Beispiel für "Hallo Welt". Bis wir uns das nächste Mal wiedersehen, wünsche ich Ihnen alles Gute.