Как я могу исправить эту функцию - PullRequest
0 голосов
/ 20 октября 2019

Я работал над школьным заданием, используя Haskell, и снова и снова получаю одни и те же ошибки синтаксического анализа. Я искал онлайн и не получил решения моей проблемы. Любой совет будет принята с благодарностью. Вот функция ...

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)

Попробуйте онлайн!

1 Ответ

3 голосов
/ 20 октября 2019

Код, который вы разместили в ссылке, отличается от кода, который вы разместили в теле вопроса.

Вот ваш код, который на самом деле имеет ошибки разбора

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)

Эта реализация также немного отличается тем, что обрабатывает пустые списки вместо ошибок.

...