Здравствуйте.
Есть небольшая задачка. Имеется строка текста, которую нужно разобрать, т.е. осуществить преобразование: строка -> объект определенного типа. Этот объект включает в себя всевозможную информацию, которая может быть выбрана из этой строки. Существует набор правил в виде регулярных выражений, которые и определяют содержимое этой строки. Правил может быть много, и они могут добавляться со временем. Сейчас используется такой подход — большая цепочка if else, в которых последовательно применяется каждое регулярное выражение (правило) к исходной строке, и если результат успешный, то в этом блоке производится выборка соответствующих текстовых полей из регулярного выражения, приведение к определенному типу (число, дата, т.п.) и изменение соотвествующего поля в объекте (который в конечном итоге и возвращается как результат), а если результат неуспешный — то переход к следующему if else. Получается как-то длинно и некрасиво. Возможно ли как-то улучшить подход, применяя функциональные возможности в последних версиях C#? Ведь по идее правило можно представить не в виде регулярного выражения, а в виде функции, которая принимает строку, а возвращает (применив регулярное выражение и выбрав из текста нужные параметры) какое-то значение. Точнее тип возвращаемого значения должен включать и неудачу (когда применение регулярного выражения выдало false). Т.е. это получается Maybe-вычисление. А потом такие правила можно комбинировать... И неужели в результате получаются монадные вычисления?
Помогите, направьте на путь истинный, не ошибся ли я в своих рассуждениях, дайте совет по реализации.
Да, монады тут к месту, а особенно напрашиваются парсер-комбинаторы. В данном случае можно даже применить оптимизирующие, получив линейное время разбора. Подробности (не на C#, правда)
тут. В апрельском номере
ПФП ожидается статейка на эту тему.