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

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

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

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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.