Warum ist mein Haskell-code, die sagen, 'variable nicht im Lieferumfang: main'?
Wenn ich geben Sie den folgenden in der interaktiven shell von Haskell auf den repl.es website, es funktioniert perfekt.
let squareMe x = x * x
let myFruit = ["banana", "apple", "kiwi", "orange"]
Aber wenn ich es in eine source-Datei und klicken Sie auf "Ausführen" bekomme ich die Fehlermeldung:
<interactive>:3:1: error:
• Variable not in scope: main
• Perhaps you meant ‘min’ (imported from Prelude)
Ich habe versucht zu verstehen, diese Fehler und kommen mit einer Lösung für ein paar Stunden nun und bin nicht näher an eine Lösung zu finden oder zu verstehen, was der Fehler bedeutet.
- Ein Programm benötigt einen Einstiegspunkt: ein monadischen Funktion, die aufgerufen wird
main
. - Was du geschrieben hast ist nicht wirklich korrekt. Der code ist nicht komplett (ich vermisse
main
). Auch, überprüfen Sie bitte lass es sein. Ich schlage vor, zu Lesen, das Buch vom Anfang.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Haskell-REPL (GHCi) und der tatsächlichen Haskell-Programme sind deutlich anders.
Den Gründen für diesen Unterschied ist das Ziel der beiden Formate. Erstens, GHCi ist ein Test-Bereich keine code-running-Bereich. Jedoch Haskell-Quellcode-Dateien gemeint sind, die zum ausführen eines bestimmten Prozesses, die den Namen
main
. Beim ausführen einer Quelldatei, die Haskell-compiler (in der Regel GHC) sieht für dieIO
Aktion namensmain
, und versucht, es auszuführen. In diesem Fall gab es keinemain
, so ist es gescheitert.Zweitens, was Sie eingegeben haben, ist kein Gültiger Haskell-Programm, das sind die Erklärungen, die wäre in Ordnung, im GHCi, aber nicht in Haskell Quelle. Dies wäre korrekt, in einer Quellcode-Datei:
Beachten Sie das fehlen von
let
; Haskell-Quellcode-Dateien nicht verwenden, es zu erklären, Dinge.Beachten Sie, dass auf repl.es wird dies noch beschweren, dass
main
fehlt, aber Sie können dann finden SiesquareMe
undmyFruit
in der REPL ohne sorgen. In anderen Worten, der Fehler wird immer noch angezeigt, aber es spielt keine Rolle, denn du kannst verwenden, was du geschrieben hast in die Datei dennoch.Wenn Sie wollten, unterdrückt die Warnung, könnten Sie schreiben die Zeilen:
Gibt es viele Dinge, die Sie haben könnten das Programm machen, statt dieser. Hier sind ein paar Beispiele:
main = putStrLn "No errors!"
DruckenNo errors!
wenn Sie es ausführen.main = print myFruit
Drucken["banana", "apple", "kiwi", "orange"]
wenn Sie es ausführen.Bitte beachten Sie, dass diese Antwort gilt vor allem auf der Website repl.speziell, wenn dies im Allgemeinen ist, wie Haskell-Programme sind so strukturiert.
Wenn Sie kompilieren eine Haskell-Quellcode-es muss ein
main
symbol als Einstiegspunkt, genau wie beim kompilieren z.B. ein C-Programm. Auch in einer kompilierten Datei müssen Sie überspringen dielet
s. E. g.show
innerhalbprint
: das ist schon polymorphe auf den Eingang geben.print x = putStrLn (show x)
, so ruft der codeshow
zweimal.print
wahrscheinlich sollte nicht einmal in die prelude, da es wird die falsche Funktion, sobald Sie wollen, um Stück zusammen die Ausgabe von mehreren Werten, oder fügen Sie neue Zeilen oder was auch immer.print = putStrLn . show
,readLn = readIO =<< getLine
, und weder von diesen Komfort-Funktionen der Wert scheint der didaktische Aufwand.print
auch praktisch zu Zustimmen. In der Tat, ich würde eher geneigt sein, zu sagenShow
undRead
sollte nicht in das Vorspiel. (Sollte man nur sehr selten das Bedürfnis zu konvertieren, alles zu/von string, außer für den Zweck des Tuns IO mit diesen Saiten.)print
mitputStrLn
.Wenn das, was du schreibst ist mehr wie eine Bibliothek oder ein Satz von utility-Routinen als ein komplettes Programm, können Sie erklären es als ein
module
. Dann GHC kompilieren wird es zu einem Objekt können Sie eine Verknüpfung zu anderen Programmen, und Sie können auch laden Sie es im GHCI. Es wird nicht erwartet werden, enthalten einemain
routine.Wenn Sie speichern Sie diese auf einem
.hs
Datei:Kompilieren mit GHC wird Ihnen eine
.hi
- Datei und eine.o
- Datei, und es läuft in GHCI geben Sie diese:Können Sie auch berechnen Sie einen Ausdruck, der auf eine Bibliothek von der Kommandozeile aus.
ghc -e "squareMe 2" Example.hs
Drucke4
.