2016-09-05 9 views
0

I가 명령 줄에 잘 작동합니다 다음 코드를이유는 하스켈에서 내 코드가 아닌 파일에서 명령 줄에서 작동하지

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 모듈은 선언으로 구성되어야합니다.

예를 들어, 표현식은 1+1 일 수 있지만 소스 파일의 최상위 레벨로서 이해가되지 않는 사람의 관점에서도 - 변수가 선언되지 않고 수행되지 않습니다. 같은 있지만 let로 할 수있는

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

또는 REPL에서 : 최상위 레벨에서이 같은 값을 선언 할 수 있습니다 (즉, 파일을 소스)

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

하스켈 모듈을, 일반적으로 some_var = expression 양식의 선언이 포함되어 있습니다. 이 행은 표현식 (lazilly)을 평가하고 변수 some_var에 할당 ("바인드")합니다. 표현식 자체 만 넣으면 ("알몸 표현") 컴파일러는 그걸로 무엇을해야하는지 알지 못합니다. 그래서 변수에 바인드하거나 다른 변수를 사용해야합니다. 그래서 예를 들어, 다음은 컴파일해야합니다 :

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)]