2016-12-02 3 views
1

Je suis ghci et trouve que les travaux suivants:Haskell plusieurs lignes `` let` dans ghci`

let foo = ["a", "b", "c"] 

... mais cela ne fonctionne pas:

let bar = ["a", 
      "b", 
      "c"] 

... ni ce que cela:

let baz = ["a"] ++ 
      ["b"] ++ 
      ["c"] 

La même erreur est fournie lorsque je tente de le compiler dans un fichier, il est donc pas quelque chose qui vient d'être dans ghci contre ghc.

L'erreur:

[1 of 1] Compiling Main    (test.hs, test.o) 

test.hs:3:1: error: 
    parse error (possibly incorrect indentation or mismatched brackets) 

Répondre

4

En GHCi vous pouvez utiliser :{ :} pour les expressions multilignes. Par exemple:

Prelude> :{ 
Prelude| let bar = ["a", 
Prelude|   "b", 
Prelude|   "c"] 
Prelude| :} 

Le :{ :} conserve GHCi d'évaluer votre code après le prochain saut de ligne et de lancer des erreurs à vous parce que ce n'est pas une expression complète.

Notez également que le let n'est pas nécessaire pour les définitions de niveau supérieur. Dans un fichier source Haskell normale vous suffit d'écrire:

bar = ["a", 
     "b", 
     "c"] 

De plus dans les nouvelles versions ghci (8.0+) vous n'avez pas besoin let soit.

+0

Que faire si je devais compiler le code avec 'ghc' (pas' ghci') – Scoobie

+0

Dans un fichier source, vous n'avez pas besoin de ': {:}'. Vous venez d'écrire normal Haskell. ': {:}' sont juste là pour empêcher GHCi d'évaluer votre code et de vous lancer des erreurs après le premier retour à la ligne. – jpath

+0

Ce code multiligne ne se compile pas non plus dans 'ghc'. let foo = [ "a", "b", "c"] let bar = [ "a", "b", "c"] let baz = [ "a"] ++ [ "b"] ++ [ "c"] principal = print foo (par exemple) – Scoobie