2016-09-05 7 views
0

У меня есть следующий код, который хорошо работает в командной строке:Почему мой код в Haskell работать в командной строке, но не в файле

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

, но когда я его в файл и скомпилировать его, его не работает, и я получаю сообщение об ошибке:

[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. 

ответ

6

REPL, GHCi, принимает выражения Haskell. В отличие от Python, модуль Haskell должен состоять из объявлений.

Например, выражение может быть 1+1, но даже с точки зрения человека, которое не имеет смысла в качестве верхнего уровня исходного файла - нет объявленной переменной и никакой операции не выполняется. На верхнем уровне вы можете объявить значение, например:

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

Или в REPL вы можете сделать то же самое, но с let:

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

A модуль Haskell (т.е. источник файла), обычно содержит декларации формы some_var = expression. Эта строка будет оценивать выражение (lazilly) и назначать его («привязать» его) к переменной some_var. Если вы просто поместите выражение само по себе («обнаженное выражение»), компилятор не знает, что с ним делать. Поэтому вам нужно привязать его к некоторой переменной или сделать что-то еще с ней. Так, например, следующее complile:

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

Теперь, это не очень полезный модуль, и в самом деле, если вы пытаетесь скомпилировать его как исполняемый (а не библиотеки), она не будет выполнена. Это связано с тем, что исполняемые файлы должны определять переменную, называемую main. Так что если вы хотите полную программу, которая будет компилировать, вы можете попробовать это

main = print sumSqaures 

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

или даже просто линии

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