2017-02-06 7 views
1

는 다음과 같은 코드를 생각해 보자. 그러나이 코드는 구문 분석을 수행합니다.왜 이것이 do 표기법의 구문 분석 오류입니까?</p> 그것은 <code>ghc</code>에서 구문 분석하지 않습니다 <pre><code>foo = do let bar = do baz bar </code></pre> <p>버전 8. 그것은 <code>baz</code>을 포함하는 행에 대해 불평 :

foo = do 
    let bar = do 
     baz 
    bar 

이 혼동이 있습니다. 두 버전의 근본적인 차이점은 무엇입니까?

답변

4

문제는 들여 쓰기가 사람이없는 땅에 baz을 넣는 것입니다. let 표현식의 일부가 될 정도로 들여 쓰이지는 않지만 let 표현식을 포함하는 do 표현식의 다음 부분이 되기에는 너무 들여 쓰기가됩니다.

+0

두 칸이'do' 블록의 일부가되기에 충분하지 않은 이유는 무엇입니까? 'let'의 직접적인 부분이 아니라,'let'에 값이 할당되지 않았 음을 주목하십시오. – Turion

+1

@Turion Haskell의 레이아웃 규칙에 따르면, "let"또는 "where"의 RHS에있는 모든 것이 LHS의 패턴의 첫 번째 열만큼 적어도 들여 쓰기되어야합니다. 첫 번째 예제에서,'baz'는'bar'까지 들여 쓰이지 않습니다. 괜찮지는 않지만 두 번째 예에서는 그렇습니다. –