Erreur d'analyse Haskell sur l'entrée `= '

111

Je suis nouveau sur Haskell et après avoir commencé, ghcij'ai essayé:

f x = 2 * x

et j'ai obtenu:

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

ce que je ne comprends pas.

Étrangement, cela fonctionnait bien avant. Je suppose que j'ai fait Haskell mal configuré. La réinstallation de ghc6 ne résout pas le problème.

Pour information, j'utilise Ubuntu 10.4 et la version de ghc6 est 6.12.1-12

Fils
la source

Réponses:

160

Dans GHCi 7.x ou version antérieure, vous avez besoin d'un letpour définir des éléments.

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

À partir de GHC 8.0.1, les liaisons de niveau supérieur sont prises en charge dans GHCi , donc le code d'OP fonctionnera sans changement.

GHCi, version 8.0.1.20161213: http://www.haskell.org/ghc/  :? for help
Prelude> f x = x * 2
Prelude> f 4
8
KennyTM
la source
15
Merci. "Real world haskell" (au moins la version que j'ai) n'a pas le letdans ses exemples
Micah
43
"Apprenez-vous Haskell" ne le mentionne pas du tout.
Bakuriu
2
@Bakuriu LYAH ne mentionne maintenant let. Mais un suivi. Dans LYAHj'ai lu addThree :: Int -> Int -> Int -> Int(nouvelle ligne) addThree x y z = x + y + zmais seul le second fonctionne GHCiavec let. Pourquoi?
isomorphismes
9
@Bakuriu Oui mais l'auteur vous dit d'écrire vos définitions dans un fichier externe et de le charger dans GHCI, pas de les écrire directement dans GHCI. Et le premier fonctionne parfaitement.
superzamp
Ce tutoriel est alors tout à fait faux: seas.upenn.edu/~cis194/lectures/01-intro.html . C'est pourtant le premier tutoriel recommandé sur le site haskell!
cammil
51

Lorsque vous tapez dans un fichier source Haskell,

f x = 2 * x

est correct.

Lorsque vous tapez directement dans ghci, vous devez taper letau début de la ligne:

let f x = 2 * x
dave4420
la source
12
Pourquoi cela ne fonctionne-t-il pas dans GHCi? Pourquoi y a-t-il une différence dans la syntaxe?
Battre le
1
@Beat GHCi essaie d'évaluer les expressions par défaut, pas d'analyser les instructions, alors que le format de fichier est le contraire. C'est pourquoi, pour faire des déclarations (c'est-à-dire: définir des variables, définir des fonctions, etc.), vous devez déclarer que vous utilisez let. Considérez GHCi comme une grande let ... in ...déclaration.
AJFarmar le
20

Une bonne règle de base pour utiliser ghci est que tout code que vous entrez doit être conforme à la sémantique do-block; c'est-à-dire que vous pouvez supposer syntaxiquement que vous programmez dans la monade IO (s'il s'agit d'une nouvelle terminologie, ne vous inquiétez pas! Je vous recommande vivement de lire ce tutoriel ).

Cette réponse illustre ce point avec un exemple et peut fournir un aperçu plus pratique de la nature des IO et ghci.

Raeez
la source
26
Cette réponse est inutile pour un débutant. Il recherche un simple indice exploitable pour avancer, pas des sujets avancés. Vous n'expliquez pas les produits polynomiaux à un enfant qui apprend la table de multiplication - cela ne montre pas ce que vous savez, cela montre que vous ne savez pas comment partager ce que vous savez.
btk le
3
@btk: tout le monde doit cesser d'être un débutant à un moment donné. J'ai commencé à apprendre Haskell hier et je suis convaincu que dans peu de temps, je comprendrai tout ce que Raeez dit.
Vietnhi Phuvan
10
C'est ma première journée d'apprentissage de Haskell, et j'ai trouvé cette réponse très utile pour comprendre pourquoi je dois utiliser let; J'étais comme "wtf, pourquoi dois-je utiliser let" et puis j'ai lu ceci et j'ai été éclairé.
Brian Tingle
4

À partir de GHC 8.0.1, cela ne générerait plus d'erreur.

Glguy
la source