2016-09-05 4 views
0

je le code suivant qui fonctionne bien sur la ligne de commande:Pourquoi mon code Haskell fonctionne en ligne de commande, mais pas dans un fichier

ghci> [let square x = x * x in (square 5, square 3, square 2)] 
[(25,9,4)] 

mais quand je l'ai dans un fichier et le compiler, il ne fonctionne pas et j'obtiens une erreur:

[1 of 1] Compiling Main    (baby.hs, interpreted) 

baby.hs:62:1: 
    Parse error: naked expression at top level 
    Perhaps you intended to use TemplateHaskell 
Failed, modules loaded: none. 

Répondre

6

Le REPL, GHCi, accepte les expressions Haskell. Contrairement à Python, un module Haskell doit être composé de déclarations. Par exemple, une expression peut être 1+1 mais même d'un point de vue humain qui n'a aucun sens en tant que niveau supérieur d'un fichier source - aucune variable n'est déclarée et aucune opération n'est effectuée. Au niveau supérieur, vous pouvez déclarer une valeur, tels que:

val = [let square x = x * x in (square 5, square 3, square 2)] 

Ou dans le REPL vous pouvez faire la même chose mais avec let:

let val = [let square x = x * x in (square 5, square 3, square 2)] 
3

Un module haskell (c.-à-source d'un fichier), contient généralement des déclarations de la forme some_var = expression. Cette ligne va évaluer l'expression (lazilly), et l'affecter ("lier") à la variable some_var. Si vous venez de mettre une expression par elle-même (une "expression nue"), le compilateur ne sait pas quoi en faire. Vous devez donc le lier à une variable ou faire autre chose avec. Ainsi, par exemple, ce qui suit complile:

sumSqaures = [let square x = x * x in (square 5, square 3, square 2)] 

Maintenant, ce n'est pas un module très utile, et en fait, si vous essayez de le compiler comme un fichier exécutable (et non une bibliothèque), il échouera. En effet, les exécutables sont supposés définir une variable appelée main. Donc, si vous voulez un programme complet qui compilera, vous pouvez essayer cette

main = print sumSqaures 

sumSqaures = [let square x = x * x in (square 5, square 3, square 2)] 

ou même juste la ligne

main = print [let square x = x * x in (square 5, square 3, square 2)]