Errore di analisi dell'errore Haskell sull'input "="


111

Sono nuovo su Haskell e dopo aver iniziato ghciho provato:

f x = 2 * x

e ho ottenuto:

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

che non capisco.

Stranamente, ha funzionato bene prima. Suppongo di aver sbagliato la configurazione di Haskell. La reinstallazione di ghc6 non risolve il problema.

Per informazioni, utilizzo Ubuntu 10.4 e la versione di ghc6 è 6.12.1-12

Risposte:


160

In GHCi 7.xo inferiore, è necessario un letper definire le cose in esso.

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

A partire da GHC 8.0.1, le associazioni di primo livello sono supportate in GHCi , quindi il codice di OP funzionerà senza modifiche.

GHCi, version 8.0.1.20161213: http://www.haskell.org/ghc/  :? for help
Prelude> f x = x * 2
Prelude> f 4
8

15
Grazie. "Real world haskell" (almeno la versione che ho) non ha il letnei suoi esempi
Micah

43
"Learn you Haskell" non lo menziona affatto.
Bakuriu

2
@Bakuriu LYAH fa ora menzione let. Ma un seguito. In LYAHho letto addThree :: Int -> Int -> Int -> Int(newline) addThree x y z = x + y + zma solo il secondo funziona GHCicon let. Perché?
isomorfismi il

9
@Bakuriu Sì ma l'autore ti dice di scrivere le tue definizioni in un file esterno e di caricarlo all'interno di GHCI, non di scriverle direttamente in GHCI. E il primo funziona perfettamente.
superzamp

Questo tutorial è quindi chiaramente sbagliato: seas.upenn.edu/~cis194/lectures/01-intro.html . Eppure è il primo tutorial consigliato sul sito haskell!
cammil

51

Quando digiti in un file sorgente Haskell,

f x = 2 * x

è corretto.

Quando digiti direttamente in ghci, devi digitare letall'inizio della riga:

let f x = 2 * x

12
Perché non funziona in GHCi? Perché c'è una differenza nella sintassi?
Battere l'

1
@Beat GHCi cerca di valutare le espressioni per impostazione predefinita, non le istruzioni di analisi, mentre il formato del file è l'opposto. Ecco perché, per fare dichiarazioni (es .: impostare variabili, definire funzioni, ecc.) Devi dichiarare che stai usando let. Pensa a GHCi come a una grande let ... in ...affermazione.
AJFarmar

20

Una buona regola pratica per usare ghci è che qualsiasi codice immesso deve essere conforme alla semantica do-block; cioè, potresti presumere sintatticamente che stai programmando all'interno della monade IO (se questa è una nuova terminologia, non preoccuparti! Consiglio vivamente di leggere questo tutorial ).

Questa risposta illustra questo punto con un esempio e può fornire ulteriori informazioni di lavoro sulla natura di IO e ghci.


26
Questa risposta è inutile per un principiante. Sta cercando un semplice suggerimento utilizzabile per andare avanti, non argomenti avanzati. Non spieghi i prodotti polinomiali a un bambino che impara la tavola pitagorica - non mostra quanto sai, mostra che non sai come condividere ciò che sai.
btk

3
@btk: tutti devono smettere di essere un principiante ad un certo punto. Ho iniziato a imparare Haskell ieri e sono fiducioso che in breve tempo capirò tutto ciò che Raeez dice.
Vietnhi Phuvan

10
Questo è il mio primo giorno che imparo Haskell e ho trovato questa risposta molto utile per capire perché devo usare let; Ero tipo "wtf, perché devo usare let" e poi ho letto questo e sono stato illuminato.
Brian Tingle

4

A partire da GHC 8.0.1, ciò non genererebbe più un errore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.