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.
Großartig, das funktioniert. Vielen Dank. Also, wenn ich eine Signatur auf die Hauptmethode setzen wollte, wäre es "Haupt :: IO Bool" noch? –
Nein, da Sie drucken, wäre es 'Main :: IO()'. Drucken bringt nichts Interessantes, also 'print :: Zeige a => a -> IO()'. –
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? –