Здесь есть несколько проблем.Давайте начнем с синтаксиса.
Ваши else
части должны иметь отступ , равный или больше if
, к которому они относятся , например, вот так:
if ...
then ...
else if ...
then ...
else ...
Далее ваши функции приложения.В отличие от многих других языков, в Haskell круглые скобки используются только для группировки и кортежей .Поскольку применение функций в Haskell очень распространено, мы используем для этого максимально упрощенный синтаксис, а именно пробелы.Чтобы применить функцию maxord'
к аргументам strs
, m+1
и n
, мы пишем maxord' strs (m+1) n
.Обратите внимание, что поскольку приложение-функция имеет наивысший приоритет, мы должны добавить круглые скобки вокруг m+1
, иначе это будет интерпретировано как (maxord' strs m) + (1 n)
.
Вот и все для синтаксиса.Следующая проблема является семантической, а именно, что у вас есть рекурсия без базового случая .Используя шаблон (str:strs)
, вы указали, что делать, когда у вас осталось несколько символов, но вы не указали, что делать, когда достигнете конца строки.В этом случае мы хотим вернуть n
, поэтому мы добавляем регистр для этого.
maxord' [] m n = n
Фиксированный maxord'
, таким образом,
maxord' [] m n = n
maxord' (str:strs) m n =
if isAlpha str == True
then maxord' strs (m+1) n
else if m >= n
then maxord' strs 0 m
else maxord' strs 0 n
Однако,Обратите внимание, что это решение не очень идиоматично.Он использует явную рекурсию, if
выражения вместо охранников, сравнивая булевы значения с True
и имеет очень императивный вид.Более идиоматическим решением было бы что-то вроде этого.
maxord = maximum . map length . words
Это простая цепочка функций, где words
разбивает ввод в список слов, map length
заменяет каждое слово его длиной, иmaximum
возвращает максимум из этих длин.
Хотя обратите внимание, что это не то же самое, что ваш код, так как функция words
использует несколько другие критерии при разбиении ввода.