Функциональные парсеры: различия между версиями

symbola :: Parser Char Char
symbola [] = []
symbola (x:xs) | x == ‘a’ = [(xs, ‘a’)]
| otherwise = []
 
Сразу же становится очевидным преимущество списка благоприятных исходов, потому что теперь мы можем вернуть пустой список в том случае, когда разбор невозможен (так как входная строка пуста или не начинается с символа «а»).
Таким же образом мы можем написать парсеры, распознающие другие символы. Как всегда вместо того, чтобы определять много тесно связанных функций, лучше абстрагироваться от распознаваемого символа, сделав его дополнительным параметром функции. Также функция может оперировать со строками, состоящими из элементов, отличных от символов, таким образом, она может быть применена в приложениях, ориентированных на обработку не только символьных данных. Единственным необходимым условием является то, что символы, которые нужно разобрать могут пройти проверку на равенство. В языке Gofer это обозначается предикатом Eq в типе функции:
 
symbol :: Eq s => s -> Parser s s
symbol a [] = []
symbol a (x:xs) | a == x = [(xs, x)]
Анонимный участник