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

Ответы

Ответ 1

Вам нужна скобка:

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)

который является ошибкой.

Ответ 2

Вам нужно поместить шаблоны конструктора (или, тем не менее, их вызывать) в скобки.

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