Um auf John Palmer Kommentar zu erweitern:
F # erwartet jede Funktion einen einzigen Rückgabetyp haben. Zum Beispiel können Sie eine Funktion schreiben, die einen int akzeptiert und einen int zurückgibt, was eine Funktion des Typs int -> int
wäre. Eine Funktion, die Strings in Ints zerlegt, ist vom Typ string -> int
. Und so weiter.
Nun, was ist der Rückgabetyp der checkType
-Funktion, die Sie geschrieben haben? Da Sie keinen Rückgabetyp angeben, prüft der Compiler den Typ der Werte, die Sie von der Funktion zurückgeben können. Jeder mögliche Codezweig muss einen Wert zurückgeben, und alle müssen vom selben Typ sein. So sieht es Ihre match
Anweisung, sieht, dass seine erste Verzweigung eine string
zurückgibt, und sagt: "Ah ha! Ich habe den Rückgabetyp dieser Funktion herausgefunden; das ist eine Funktion, die eine Expr
nimmt und eine Zeichenfolge zurückgibt Funktionstyp ist Expr -> string
. "
Dann sieht es bei der zweiten Filiale Ihrer match
Aussage und sagt: „Warten Sie eine Minute Dies ist eine Funktion, die ein string
zurückgibt, aber in diesem Codezweig ist es ein int
Rückkehr Das ist nicht gültig:.. Der Code, der Diese Funktion muss wissen, welcher Typ erwartet werden muss. " Und so bekommst du den Fehler.
Nun, wenn Sie waren die Reihenfolge Ihrer match
Anweisung Fällen tauschen, für die Überprüfung Integer i
zuerst, dann der Compiler würde Ihre Funktion als mit Typ Expr -> int
(unter einen Expr
Eingang und Zurücksenden eines int
Ausgang) bewerten und ein Wurf Fehler auf der | String s -> s
Linie. Diesmal ist der Fehler "Warten Sie eine Minute, das ist eine Funktion, die eine int
zurückgibt, so dass der Ausdruck s
hier vom Typ int
hätte sein sollen. Aber stattdessen ist es vom Typ string
. Das ist nicht gültig."
Oder löschen Sie die | String s -> s
Zeile, und Sie werden einen Fehler sehen "Dieser Ausdruck wurde erwartet, dass Typ int
, aber hier ist Typ bool
." Das gleiche gilt: Jede Funktion kann nur einen Rückgabetyp haben. Wenn Sie mehrere verschiedene mögliche Typen aus einer Funktion zurückgeben möchten, sind dies die diskriminierten Unions.
Weitere Informationen zu F # -Typen finden Sie unter http://fsharpforfunandprofit.com/series/understanding-fsharp-types.html.
Der aktuelle Fehler ist aufgrund der Tatsache, dass eine Funktion nur eine Art von Ausdruck –