2012-04-11 6 views
2

Gesamt Haskell noob hier. Ich habe eine einfache Funktion und eine Hauptfunktion. Ich habe keine Ahnung, was dieser Fehler bedeutet:Erwarteter Typ und Haupt

Couldn't match expected type `IO t0' with actual type `Bool' 
In the expression: main 
When checking the type of the function `main' 

, wenn Sie den Code kompilieren:

is_instructor :: String -> Bool 
is_instructor "Jeremy Erickson" = True 
is_instructor x = False 

main :: Bool 
main = is_instructor "foo" 

Antwort

4

main ist die Sache, die aufgerufen wird, wenn Sie Ihr Programm ausführen. Es wird erwartet, dass ein Programm in irgendeiner Weise mit der Außenwelt interagiert (Leseeingabe, Druckausgabe, solche Dinge), daher ist es vernünftig, dass eine main den Typ IO something haben sollte. Aus Gründen der Typsicherheit und Einfachheit, das ist eine Anforderung in Haskell, wie main in Java muss Typ public static void main(String[] arrgh) haben.

Sie wollten wahrscheinlich Sie werden aufgedruckten Wert, so

main :: IO() 
main = print $ is_instructor "foo" 

wäre, was Sie wollen.

+0

Großartig, das funktioniert. Vielen Dank. Also, wenn ich eine Signatur auf die Hauptmethode setzen wollte, wäre es "Haupt :: IO Bool" noch? –

+0

Nein, da Sie drucken, wäre es 'Main :: IO()'. Drucken bringt nichts Interessantes, also 'print :: Zeige a => a -> IO()'. –

+0

Sorry, immer noch verwirrt. Wenn ich die Main :: IO() - Signatur verwende, bekomme ich "Ungültige Typ-Signatur: Main :: IO(). Sollte von Form sein :: ".Sollte ich eine begleitende Druckbindung definieren, wenn ich print :: Show a => a -> IO() verwende? –

2

Sie können keine main Funktion mit Typ haben Bool, es muss immer in die sein IO monad. Was Sie wahrscheinlich wollen, ist so etwas wie Drucken diesen booleschen Wert. Dann tu das einfach!

main :: IO() 
main = print $ is_instructor "foo" 
+0

So wäre es 'main :: IO Bool, main = zurück (is_instructor" foo ")'. –

+0

@NiklasB. Nein! Die Hauptfunktion kann keine Werte direkt zurückgeben, sie muss die IO-Monade verwenden, um mit der Umgebung zu interagieren. – leftaroundabout

+0

Ich muss geschlafen haben, während ich diesen Kommentar gepostet habe. Ich meinte natürlich "IO Bool", aber der Funktionskörper selbst war auch nicht Haskell:/Das macht natürlich wenig Sinn, weil es nichts ausgibt, sondern eine direkte Übersetzung von OPs Beispiel :) –

2

Sie haben sicherlich gehört, dass Haskell eine rein funktionale Sprache ist. Dies bedeutet unter anderem, dass das einzige, was eine Funktion in Haskell tun kann, ein Ergebnis ist, das von den Argumenten abhängt; Eine Funktion kann I/O nicht ausführen oder hat ein Ergebnis, das von etwas anderem als den Werten der Argumente abhängt.

Aber Haskell können Sie Programme schreiben, die I/O und andere wirksame Dinge tun. Wie ist das möglich? Nun, was es bedeutet ist, dass in Haskell Dinge, die I/O oder Nebenwirkungen ausführen, keine Funktionen sind; Sie sind etwas anderes. Leute bezeichnen sie oft als Aktionen. E/A-Aktionen in Haskell haben Typen der Form IO a.

Der Fehler, den Sie hier bekommen, ist, dass main, der Einstiegspunkt zu einem Haskell-Programm, eine Aktion des Typs IO() sein muss. Aber is_instructor ist eine Funktion des Typs String -> Bool, und is_instructor "foo" ist ein Bool.

Haskell erlaubt Ihnen nicht, pure Funktionen und Aktionen willkürlich so zu mischen und anzupassen. Das Anwenden einer Funktion und das Ausführen einer Aktion sind zwei verschiedene Dinge und erfordern anderen Code.

Verwandte Themen