2017-02-06 6 views
1

は、次のコードを考えてみましょう:これはdo表記の解析エラーですか?

foo = do 
    let bar = do 
    baz 
    bar 

それはghcに解析されない、バージョン8それはbazを含む行について不平を言います。しかし、このコードは解析します。

foo = do 
    let bar = do 
     baz 
    bar 

これはわかりにくいです。 2つのバージョンの本質的な違いは何ですか?

答えて

4

問題はインデントが無人島にbazを置くことです。 let式の一部としてインデントされていませんが、let式を含むdo式の次の部分になるにはあまりにもインデントされています。

+0

なぜ2つのスペースが 'do'ブロックの一部になっていないのですか?値は割り当てられていないので、 'let'の直接の一部ではないことに注意してください。 – Turion

+1

@Turion Haskellのレイアウトルールでは、「let」または「where」のRHS上のすべてがLHS上のパターンの最初の列まで少なくとも*インデントされる必要があります。あなたの最初の例では、 'baz'は' bar'までインデントされていませんが、これは大丈夫ではありませんが、2番目の例ではそうです。 –

関連する問題