Haskell-Fehler Analysefehler bei Eingabe `= '

111

Ich bin neu in Haskell und habe nach dem Start ghciversucht:

f x = 2 * x

und ich erhielt:

<interactive>:1:4: parse error on input `='

was ich nicht verstehe.

Seltsamerweise hat es vorher gut funktioniert. Ich nehme an, dass ich Haskell falsch konfiguriert habe. Die Neuinstallation von ghc6 löst das Problem nicht.

Zur Information benutze ich Ubuntu 10.4 und die Version von ghc6 ist 6.12.1-12

Sohn
quelle

Antworten:

160

In GHCi 7.x oder niedriger benötigen Sie a let, um die darin enthaltenen Elemente zu definieren.

Prelude> let f x = x * 2
Prelude> f 4
8

Ab GHC 8.0.1 werden Bindungen der obersten Ebene in GHCi unterstützt , sodass der OP-Code unverändert funktioniert.

GHCi, version 8.0.1.20161213: http://www.haskell.org/ghc/  :? for help
Prelude> f x = x * 2
Prelude> f 4
8
kennytm
quelle
15
Vielen Dank. "Real World Haskell" (zumindest die Version, die ich habe) hat das nicht letin seinen Beispielen
Micah
43
"Learn you Haskell" erwähnt dies überhaupt nicht.
Bakuriu
2
@ Bakuriu LYAH erwähnt jetzt let. Aber ein Follow-up. In LYAHlese ich addThree :: Int -> Int -> Int -> Int(Zeilenumbruch) addThree x y z = x + y + zaber nur der zweite läuft GHCimit let. Warum?
Isomorphismen
9
@ Bakuriu Ja, aber der Autor fordert Sie auf, Ihre Definitionen in eine externe Datei zu schreiben und in GHCI zu laden, nicht direkt in GHCI. Und ersteres funktioniert perfekt.
Superzamp
Dieses Tutorial ist dann einfach falsch: seas.upenn.edu/~cis194/lectures/01-intro.html . Es ist jedoch das erste auf der haskell-Website empfohlene Tutorial!
Cammil
51

Wenn Sie in eine Haskell-Quelldatei eingeben,

f x = 2 * x

ist richtig.

Wenn Sie direkt in ghci eingeben, müssen Sie letam Anfang der Zeile Folgendes eingeben :

let f x = 2 * x
dave4420
quelle
12
Warum funktioniert es nicht in GHCi? Warum gibt es einen Unterschied in der Syntax?
Schlagen
1
@Beat GHCi versucht standardmäßig, Ausdrücke auszuwerten, keine Anweisungen zu analysieren, während das Dateiformat das Gegenteil ist. Um Anweisungen zu erstellen (dh Variablen setzen, Funktionen definieren usw.), müssen Sie daher deklarieren, dass Sie verwenden let. Stellen Sie sich GHCi als eine große let ... in ...Aussage vor.
AJFarmar
20

Eine gute Faustregel für die Verwendung von ghci ist, dass jeder von Ihnen eingegebene Code der Do-Block-Semantik entsprechen sollte. Das heißt, Sie könnten syntaktisch davon ausgehen, dass Sie innerhalb der E / A-Monade programmieren (wenn dies eine neue Terminologie ist, machen Sie sich keine Sorgen! Ich würde dringend empfehlen, dieses Tutorial durchzulesen ).

Diese Antwort veranschaulicht diesen Punkt anhand eines Beispiels und bietet möglicherweise einen besseren Einblick in die Natur von IO und ghci.

Raeez
quelle
26
Diese Antwort ist für einen Anfänger nutzlos. Er sucht nach einem einfachen umsetzbaren Hinweis, um vorwärts zu kommen, nicht nach fortgeschrittenen Themen. Sie erklären einem Kind, das die Multiplikationstabelle lernt, keine Polynomprodukte - es zeigt nicht, wie viel Sie wissen, es zeigt, dass Sie nicht wissen, wie Sie das, was Sie wissen, teilen sollen.
BTK
3
@btk: Jeder muss irgendwann aufhören, Anfänger zu sein. Ich habe gestern angefangen, Haskell zu lernen und bin zuversichtlich, dass ich in kurzer Zeit alles verstehen werde, was Raeez sagt.
Vietnhi Phuvan
10
Dies ist mein erster Tag, an dem ich Haskell lerne, und ich fand diese Antwort sehr hilfreich, um zu verstehen, warum ich sie verwenden muss let. Ich war wie "wtf, warum muss ich verwenden let" und dann las ich dies und wurde erleuchtet.
Brian Tingle
4

Ab GHC 8.0.1 würde dies keinen Fehler mehr erzeugen.

glguy
quelle