2011-12-19 100 views
15

誰願意告訴我這段代碼有什麼問題(在語法上)?Haskell:解析模式中的錯誤

-- 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 

解釋:在模式

解析錯誤:mergeX

回答

30

你需要一些括號:

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) 

的原因是因爲:比功能的優先級低應用程序,所以mergeX a:as b:bs res將解析爲:

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

這是一個錯誤。

+0

謝謝,我記得我有過。像之前一樣;)。 您是否通常總是使用(x:xs)而不是x:xs來防止錯誤? – user905686 2011-12-19 13:55:15

+1

@ user905686:在一種模式中,是的。 – kennytm 2011-12-19 13:58:14

1

您需要將構造函數模式(或稱爲它們被稱爲)放入隱含關係中。

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