2011-12-19 38 views
15

Ai thích cho tôi biết điều gì sai với mã này (cú pháp)?Haskell: Lỗi phân tích cú pháp trong mẫu

-- merge two sorted lists 
mergeX [] b res = b ++ res 
mergeX a [] res = a ++ res 
mergeX a:as b:bs res 
    | a > b  = mergeX as b:bs a:res 
    | otherwise = mergeX a:as bs b:res 

Interpreter:

lỗi Parse trong mẫu: mergeX

Trả lời

30

Bạn cần một số ngoặc:

mergeX [] b res = b ++ res 
mergeX a [] res = a ++ res 
mergeX (a:as) (b:bs) res 
    | a > b  = mergeX as (b:bs) (a:res) 
    | otherwise = mergeX (a:as) bs (b:res) 

Lý do là vì : có độ ưu tiên thấp hơn chức năng ứng dụng, vì vậy mergeX a:as b:bs res sẽ là được phân tích cú pháp là:

(mergeX a):(as b):(bs res) 

đó là lỗi.

+0

Cảm ơn, tôi nhớ rằng tôi đã có sth. như thế trước đây;). Bạn có thường sử dụng (x: xs) thay cho x: xs để ngăn ngừa lỗi không? – user905686

+1

@ user905686: Trong một mẫu, có. – kennytm

1

Bạn cần đặt các mẫu hàm tạo (hoặc tuy nhiên chúng được gọi) trong các dấu ngoặc đơn.

mergeX (a:as) (b:bs) res 
Các vấn đề liên quan