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

Спасибо, я помню, что у меня было. как раньше;). Обычно вы используете x (x: xs) вместо x: xs для предотвращения ошибок? – user905686

+1

@ user905686: В шаблоне да. – kennytm

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^