В выражениях и шаблонах :
имеет более низкий приоритет, чем тип приложения. Следовательно, этот вид шаблона:
f (D x:xs) = ...
будет проанализирован как:
f ((D x):xs) = ...
что неверно. Вы хотите указать явно:
f (D (x:xs)) = ...
Или в вашем конкретном случае:
(D (fstint:xs)) [] -> ...
(D (fstint:xs)) (D (sndint:ys)) | fstint > sndint -> ...
...
В правой части этих выражений есть та же проблема:
D (fstint + sndint) : xs
Будет проанализирован как:
(D fstint + sndint) : xs
Должно быть:
D (fstint + sndint : xs)
Наконец, другой ответ от @ assembly.jc также необходим для его исправления - аргумент выражения case
имеет неопределенные переменные. Вы, вероятно, хотели сказать, что (x:xs)
- это lst1
, а (y:ys)
- это lst2
, но учтите, что, поскольку второй список может быть пустым, проще выполнить сопоставление с шаблоном напрямую:
iterator :: Dtype -> Dtype -> Int
iterator (D fstint:xs) [] = fstint
iterator (D fstint:xs) (D sndint:ys) | fstint > sndint = ...
...