2011-09-27 9 views
7

Estoy usando Notepad ++ y WinGHCi para hacer algunos deberes y tengo que definir una pequeña "base de datos". El formato es arbitrario y no creo que sea allí donde me estoy equivocando. De todos modos, esto es lo que estoy usando en un archivo .hs *:Usando let in .hs file

let studentDB = [ 
       ("sally", ["cpsc110", "cpsc312", "cpsc204"]), 
       ("jim",  ["cpsc110", "cpsc313"]), 
       ("bob",  ["cpsc121", "cpsc303", "cpsc212"]), 
       ("frank", ["cpsc110", "cpsc212", "cpsc204"]), 
       ("billy", ["cpsc312", "cpsc236"]), 
       ("jane", ["cpsc121"]), 
       ("larry", ["cpsc411", "cpsc236"]) ] 

WinGHCi me da este error: a1.hs: 118: 1: parse error (sangría posiblemente incorrecta)

Traté de jugar tabular las tuplas sobre o y colocar mis corchetes de lista en diferentes líneas, pero no pude hacer que nada funcionara. Pensé algo más pequeño podría ayudar a localizar el fallo así que hice esto en su lugar:

let s = [] 

Pero eso me dio el mismo error. ¿Es este un error de sangría, tal vez debido a algún comportamiento peculiar de Notepad ++? ¿O está mi Haskell equivocado? Gracias.

Respuesta

14

Imagino que estás pensando que el contenido de un archivo * .hs es como lo que puedes escribir en ghci. Eso es incorrecto Cuando escribe en ghci, está escribiendo efectivamente en un bloque do. Así que la siguiente sintaxis correcta es:

main = do 
    let s = [] 
    -- do more stuff 

Sin embargo, en el nivel superior de un archivo * .hs, las cosas son diferentes. La construcción let es en realidad

let s = [] in 
    codeThatReferencesS 

Si desea definir una unión de nivel superior, sólo decir

s = [] 
+1

Exactamente lo que estaba buscando, gracias! – user966249