Haskell: ошибка разбора в шаблоне - PullRequest
16 голосов
/ 19 декабря 2011

Кто любит говорить мне, что не так с этим кодом (синтаксически)?

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

Ответы [ 2 ]

32 голосов
/ 19 декабря 2011

Вам нужно несколько скобок:

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)

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

1 голос
/ 19 декабря 2011

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

mergeX (a:as) (b:bs) res 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...