2014-01-28 1 views
8

당신은레이아웃이없는 표기법의 바인딩에 "in"이 필요합니까? 하스켈에서

main = do 
    let x = 5 
    print x 

을 말할 수있는이 컴파일되지 않습니다

main = do 
    let x = 5 
    in print x 

을하지만 명시 적 레이아웃을 사용하고있는 경우,이 컴파일되지 않습니다 :

main = do { 
    let x = 5; 
    print x; 
    } 

하지만,이 작품을 :

main = do { 
    let x = 5 
    in print x; 
    } 

맞습니까? 명시 적 레이아웃에 대해 더 읽을 수 있고 표기법을 쓰고 말할 수있는 곳이 있습니까? 그것이 내가

do { let DECLS; stmts } 

을 작성할 수 있습니다 말한대로 Section 3.14 of the Haskell 98 report 내 세 번째 예는 일을해야한다고 제안 나에게 보인다 그것은 당신의 질문에 대한 규범 적 답은 하스켈 보고서에서 찾아 볼 수있다

let DECLS in do { stmts } 
+4

세 번째 예제에서'5'가'do' 블록이 아닌'let' 블록의 일부로 구문 분석 될 때 세미콜론을 기대합니다. 그러나 나는 확신 할 정도로 충분히 자세히 보지 않았다. 암시 적 블록에서 명시 적 블록으로의 변환에 대한 보고서 섹션도 좋습니다. –

+3

@DanielWagner 당신은 거기에 뭔가 있습니다; 내가 "let {x = 5}"를하면 컴파일됩니다. " –

+2

예, 여기서 문제는 내부 렛의 레이아웃 사용과 외부 괄호의 세미콜론을 섞은 것입니다. Daniel이 말했듯이,';'는'let'의 선언문의 일부로 보여지며'do'의 선언을 더 이상 구분할 수 없습니다. 나는'do {let {x = 5}; ... "실제로 문제를"고치는 "최선의 방법입니다. 또 다른 옵션은'x' = 5 다음에';'를'let' 레이아웃의 일부로 해석 할 수없는 곳에 두는 것입니다. 예를 들어 다음 줄의 시작 부분,'print x '. – kosmikus

답변

2

로 변환 layout rule에 대한 설명

간단히 말하면 let 블록과 do 블록의 다음 명령문 사이에 세미콜론을 삽입해야합니다. 그 세미콜론은 let 블록 밖에 있어야합니다. 당신이하자 블록하지 사용 레이아웃을 경우, 즉, 쉽게는 말 :

let {x = 5}; 

그러나 다음하자 블록의하자 블록을 종료 할 수있는 유일한 방법을 사용 레이아웃을 경우 x의 열 앞에있는 열에서 행을 시작하는 것입니다. 다시 레이아웃 세미콜론이 in 앞에 삽입지고

main = do { 
    let x = 5 
    ; print x; 
} 

아, 그리고 다른 예를 들어, 그래서 당신의 코드에 desugars : 그래서 당신이 뭔가를 작성해야 것을 의미

main = do { 
    let {x = 5 
    }; 
    in print x 
} 
관련 문제