Код, который вы разместили в ссылке, отличается от кода, который вы разместили в теле вопроса.
Вот ваш код, который на самом деле имеет ошибки разбора
maxGaussNorm :: [GaussianInt] -> GaussianInt
maxGaussNorm gs = compareMax (tail gs) (head gs)
compareMax :: [GaussianInt] -> GaussianInt -> GaussianInt
compareMax gs m
gs == [] = m
gaussNorm(head gs) <= gaussNorm m = compareMax (tail gs) m
gaussNorm(head gs) > gaussNorm m = compareMax (tail gs) (head gs)
Существует двачто-то не так с этим, пропуская символ трубы |
на страже, и вы забыли включить ключевое слово where
перед определением compareMax
.
Вот код с исправленной ошибкой синтаксического анализа
maxGaussNorm :: [GaussianInt] -> GaussianInt
maxGaussNorm gs = compareMax (tail gs) (head gs)
where
compareMax :: [GaussianInt] -> GaussianInt -> GaussianInt
compareMax gs m
| gs == [] = m
| gaussNorm(head gs) <= gaussNorm m = compareMax (tail gs) m
| gaussNorm(head gs) > gaussNorm m = compareMax (tail gs) (head gs)
Код, который вы первоначально разместили с вопросом, также является решением для ошибок синтаксического анализа, переписав вспомогательную функцию в качестве функции верхнего уровня и включив каналы на охранниках
maxGaussNorm :: [GaussianInt] -> GaussianInt
maxGaussNorm [] = (0,0)
maxGaussNorm gs = maxAux (tail gs) (head gs)
maxAux :: [GaussianInt] -> GaussianInt -> GaussianInt
maxAux gs m
| gs == [] = m
| (gaussNorm (head gs)) <= (gaussNorm m) = maxAux (tail gs) m
| (gaussNorm (head gs)) > (gaussNorm m) = maxAux (tail gs) (head gs)
Эта реализация также немного отличается тем, что обрабатывает пустые списки вместо ошибок.