2016-07-07 7 views
1

에 "할"구문에서 "하자"사용하여 내가 아는이 작동합니다하스켈 --- GHCI

do name <- getLine; let nameTag = "Hello, my name is " ++ name in putStrLn nameTag 

뿐만 아니라이 코드 조각으로 GHCI에로드 :

hey = do 
    name <- getLine 
    let nameTag = "Hello, my name is " ++ name 
    putStrLn nameTag 

하지만이 작동하지 않습니다

:

do name <- getLine; let nameTag = "Hello, my name is " ++ name; putStrLn nameTag 

다음과 같은 오류 메시지가 제공 0

<interactive>:142:82: 
    parse error (possibly incorrect indentation or mismatched brackets) 

왜 작동하지 않습니까? 내가 할 수 있니? 그렇다면 어떻게?

+1

코드를 형식화하십시오. –

+1

문제는 파서가 당신의 코드 구조가'let {nameTag = ...; putStrLn nameTag}'대신'putStrLn nameTag' 대신에 할당을 기대합니다. – Bakuriu

답변

5

예, 당신이 (들) 구문 분석 명확하게하기 위해 바인딩하자 주위에 괄호를 사용할 수 있습니다

do name <- getLine; let { nameTag = "Hello, my name is " ++ name }; putStrLn nameTag 
+0

감사! 나는 괄호를 사용하려고했으나 효과가 없었다. 하스켈에서 중괄호와 괄호 사이의 근본적인 차이점은 무엇입니까? –

+1

@ RafałPłaszczyk 대괄호는 서브 표현을 구분하기위한 것입니다. 중괄호는 모호하지 않은 언어 구문을 나타냅니다. (아, 기록 구문 ...) – MathematicalOrchid

+1

@ RafałPłaszczyk 아마 하스켈은 들여 쓰기가 민감하다는 것을 알았을 것입니다. 기본적으로 괄호는'{entry1; entry2; ...} '와 같은 들여 쓰기 수준에서 블록을 작성하고 ('do, let, where, case of') 한 줄로 모든 것을 쓸 수있게합니다. 일반적으로 GHCi를 제외하고는 필요하지 않습니다. 대부분의 경우';'만으로도 충분하며 대괄호는 생략 할 수 있습니다. – chi

4

는 멕 케나에 의해 해답을 보완하기 위해이 오류는 다음과 같이 설명 할 수있다 :이 두 줄을 비교

do name <- getLine; let name1 = "One"; putStrLn name1 
do name <- getLine; let name1 = "One"; name2 = "Two"; putStrLn name1 

인간 독자는 실제로

do { name <- getLine; let { name1 = "One" } ; putStrLn name1 } 
do { name <- getLine; let { name1 = "One"; name2 = "Two" }; putStrLn name1 } 

을 의미하는 것으로 볼 수 있지만 파서는 아니다 그 똑똑한. 하스켈 파서 또는 let 레벨 (후자의 경우)에 대한 공통의 코드 부분

do name <- getLine; let name1 = "One"; 
            --^-- 

그것이 마지막 ; (위 첫 번째 경우와 같이) do 레벨에 속하는지 여부를 결정하는 보는 경우. let을 선택하고 나중에 실패합니다.