2013-08-02 33 views
9

Với những điều sau đây,Haskell: tại sao một dòng đa biểu hiện một lỗi cú pháp?

module Foo where 

main = do 
    let foo = case 0 of 
    0 -> 4 
    return() 

GHC khẳng định rằng tôi có một lỗi cú pháp:

Make.hs:5:5: parse error (possibly incorrect indentation) 

Tại sao? Tôi đã sử dụng Haskell một thời gian, và nó có vẻ đúng với tôi.

+0

Bạn đã kiểm tra các quy tắc cho thụt lề chưa? Nó được giải thích rõ ràng là có – jozefg

Trả lời

16

biểu Multiline trong cú pháp làm phải được thụt ngoài tên biến:

main = do 
    let foo = case 0 of 
     0 -> 4 
    return() 

là ok nhưng

main = do 
    let foo = case 0 of 
     0 -> 4 
    return() 

thì không.

+2

Để thêm, lý do là 'let' lấy một khối (như' do') với nhiều ràng buộc — nếu bạn thích kiểu thụt đầu dòng không liên kết, bạn có thể ngắt dòng sau 'let' như bạn với 'do'. –

+1

Điều này liên tục cắn tôi. Bạn sẽ mong đợi thụt đầu dòng trong quá khứ 'let', nhưng nó thực sự thụt đầu dòng qua tên biến. Đặt biến trên dòng riêng của nó hoạt động, nhưng trông khá xấu xí. – MathematicalOrchid

+2

Điều này thực sự khó thấy. Sự khác biệt giữa hai ví dụ là một khoảng trống ở đầu dòng '0 -> 4'. – greg7gkb