2017-09-10 13 views
7

Theo Haskell indentation rules, "Mã số là một phần của một số biểu thức sẽ được thụt lề thêm vào phần đầu biểu thức đó". Tuy nhiên, tôi thấy các ví dụ sau đây, mà dường như vi phạm các quy tắc trên, biên dịch mà không cần bất kỳ lỗi hoặc cảnh báo:vi phạm quy tắc thụt lề Haskell cho if-then-else

someFunction :: Bool -> Int -> Int -> Int 
someFunction condition a b = if condition 
then a - b 
     else a + b 

Ở đây tôi định nghĩa một hàm someFunction, cơ thể của nó là một khối if-then-else. Theo quy tắc thụt đầu dòng, khối then là một phần của cùng một biểu thức trong dòng đầu tiên, vì vậy nó phải được thụt lề xa hơn dòng trước đó của nó. Tuy nhiên, trong ví dụ của tôi, dòng thứ hai then bắt đầu ở cùng một cột với dòng đầu tiên và ví dụ này biên dịch.

Tôi không chắc chắn những gì đang diễn ra ở đây. Tôi đang làm việc với GHC phiên bản 8.0.1.

Trả lời

6

Tôi chắc chắn đây là một tạo phẩm của một số deliberate GHC variation on the indentation rule. Đẹp bắt!

GHC đọc này

foo = do 
    item 
    if a 
    then b 
    else c 
    item 

như

foo = do { 
    item ; 
    if a ; 
    then b ; 
    else c ; 
    item } 

mà nên kích hoạt một lỗi phân tích cú pháp.

Tuy nhiên, điều này rất phổ biến đến thời điểm nào đó các nhà phát triển GHC quyết định cho phép một tùy chọn ; trước thenelse. Thay đổi này sang ngữ pháp if làm cho việc biên dịch mã.

Điều này có nghĩa là if trở thành "đặc biệt", ở chỗ nó không phải thụt lề nhiều hơn, nhưng chỉ nhiều như mục trước đó. Trong mã được đăng trong câu hỏi, then được thụt lề nhiều như mục trước, do đó, có một ẩn ; trước đó và điều đó làm cho việc biên dịch mã.

Tôi vẫn cố gắng tránh "kiểu" này, vì điều này thật kỳ quặc.

(Cá nhân, tôi sẽ không có thêm trường hợp đặc biệt này để GHC. Nhưng nó không phải là một vấn đề lớn, dù sao.)

bây giờ tôi nhận thấy rằng các Wikibook đề cập đến biến thể này như là một "đề nghị" cho một tương lai phiên bản của Haskell. Đây là một chút lỗi thời bây giờ, và đã được thực hiện trong GHC kể từ đó.

+0

Trong mã bắt buộc, tôi chỉ có thể đứng 'nếu cond sau đó \ n foo \ nelse \ n bar' phong cách thẩm mỹ, những người khác lái xe cho tôi hạt. Cảm ơn GHC dudes. – luqui

Các vấn đề liên quan