Haskell: Analisar erro no padrão

Quem gosta de me dizer o que está errado com este código (sintaticamente)?

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

Intérprete:

Analisar erro no padrão: mergeX

Você precisa de alguns parênteses:

 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) 

A razão é porque : tem uma precedência menor do que a aplicação de function, então mergeX a:as b:bs res será analisado como:

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

o que é um erro.

Você precisa colocar padrões de construtor (ou como eles são chamados) em parênteses.

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