2011-12-19 16 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

ありがとう、私はsthを持っていたことを覚えています。以前のように;)。 通常、間違いを防ぐためにx:xsの代わりに(x:xs)を使用しますか? – user905686

+1

@ user905686:パターンでは、はい。 – kennytm

1

コンストラクタパターンを(または、それらを呼び出すと)パースペクティブに配置する必要があります。

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