Ошибка разбора Хаскеля на входе ')' в функции - PullRequest
0 голосов
/ 05 ноября 2018

В основном у меня есть этот код

ola xs = foldl (\acc x -> if (chr x >= 65 && chr x <= 71 || chr x >= 97 && chr x <= 103) then acc (++) x) [] xs

И когда я пытаюсь загрузить его на ghci, он говорит, что у меня есть ошибка разбора в последних скобках, так что вы можете мне помочь? Что здесь не так?

1 Ответ

0 голосов
/ 06 ноября 2018

Вы находите все встречающиеся буквы от A до G в строке в чувствительном порядке. Как сказано в комментариях, вы упускаете другой случай. В другом случае следует просто возвращать переменную acc.

Но в вашей программе все еще есть ошибки. Функция chr принимает число и возвращает символ ascii. То, что вам нужно, это ord, которое принимает char и возвращает значение ascii.

Так что версия вашей программы будет

ola xs = foldl (\acc x -> if (ord x >= 65 && ord x <= 71 || ord x >= 97 && ord x <= 103) then acc ++ [x] else acc) [] xs

Тип данных Char уже принадлежит классу Ord, поэтому вы можете сравнить его. Нет необходимости использовать орд. С этим вы можете написать выше как

ola xs = foldl (\acc x -> if (x >= 'A' && x <= 'G' || x >= 'a' && x <= 'g') then acc ++ [x] else acc) [] xs

В списке есть специальная функция, известная как фильтр, которая отбирает из списка только необходимые элементы. Используя фильтр вышеупомянутая программа будет.

ola xs = filter (\x -> x >= 'A' && x <= 'G' || x >= 'a' && x <= 'g') xs

теперь аргумент может быть просто удален, и его можно просто записать как

ola = filter (\x -> x >= 'A' && x <= 'G' || x >= 'a' && x <= 'g')

Бонус: - Но теперь, что если у вас есть какой-то случайный символ, который вы хотите проверить. Вы можете сначала создать строку для символов, которые вы хотите отфильтровать. Для приведенного выше примера этого будет достаточно.

strList=['A'..'G','a'..'g'];

Теперь отфильтруйте, используя elem. Элемент проверяет, присутствует ли данный элемент в строке.

ola xs = filter (\x -> elem x strList) xs

Бонус 2: - Что делать, если вы хотите удалить аргументы хз. Для этого сначала вам нужно сначала перевернуть аргументы элемента, чтобы список был первым.

ola = filter ((flip elem) strList)
...