23

Who likes to tell me what is wrong with this code (syntactically)?

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

Parse error in pattern: mergeX

Chris Martin
  • 30,334
  • 10
  • 78
  • 137
user905686
  • 4,491
  • 8
  • 39
  • 60

2 Answers2

40

You need some parenthesis:

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)

The reason is because : has a lower precedence than function application, so mergeX a:as b:bs res will be parsed as:

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

which is an error.

kennytm
  • 510,854
  • 105
  • 1,084
  • 1,005
2

You need to put constructor patterns (or however they are called) in parantheses.

mergeX (a:as) (b:bs) res 
Cubic
  • 14,902
  • 5
  • 47
  • 92