3

Ich versuche, einen Interpreter in F # zu schreiben. Ich möchte die Art der Ausdrücke überprüfen.Discrected Union Typ in F # mit verschiedenen Rückgabetypen überprüfen

Hier meine diskriminiert Vereinigung für die Ausdrücke ist

type Expr = 
| Integer of int 
| String of string 
| Boolean of bool 

Dies ist die Methode, die ich mit der Art zu überprüfen, bin mit

let checkType (e:Expr) = 
match e with 
| String s -> s 
| Integer i -> i 
| Boolean b -> b 

ich die Methode, ob ein Ausdruck, um bestimmen wollen, ist eine Zeichenfolge , Ganzzahl oder Boolesch.

jedoch Visual Studio gibt mir die folgenden Fehler in Zeile 4 der Checktype-Methode:

This expression was expected to have type string but here has type int 

ich etwas fehle?

+6

Der aktuelle Fehler ist aufgrund der Tatsache, dass eine Funktion nur eine Art von Ausdruck –

Antwort

6

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.

+0

Sehr klare Erklärung zurückkehren kann, dank . – k1u

-1

Sie alle Ausdrücke in eine Option Art, wie einige oder String wickeln können:

let checkType (e:Expr) = 
    match e with 
    | String e -> "we are string: " + string e 
    | Integer e-> "we are integer: " + string e 
    | Boolean e -> "we are boolean: " + string e