Отправка нечетких шаблонов в Haskell
Я пишу некоторый код разбора на дереве. (А именно, дерево зависимостей Stanford nlp)
В основном у меня есть такая функция:
m :: DepTree -> Logic
m (w, [E "nsubj" nsubj, E "dobj" dobj]) = ...
m (w, [E "nsubj" nsubj, E "prep" prep]) = ...
m (w, [E "nsubj" nsubj]) = ...
m (_, []) = error "No rules apply"
То, что я хочу, это отправить первое правило, если узел имеет nsubj
и dobj
край выходит из этого. Мне все равно, что еще это может иметь.
Ясно, что моя примерная функция этого не делает, поскольку требует, чтобы ребра присутствовали в правильном порядке, и не будет совпадать, если присутствует больше ребер.
Одним из подходов может быть использование охраны для большей выразительности, я могу сделать:
m (w, es) | (isJust.lookup "nsubj") es && (isJust.lookup "dobj") es = ...
| ...
| otherwise = error ...
Но это гораздо краше, и я даже не понимаю, как нацелить узлы.
Есть ли стандартный способ написания парсеров сопоставления с образцом над графами, как у меня? Или есть какая-то магия, основанная на монаде Возможно?
1 ответ
Вы можете использовать шаблон охранников:
{-# LANGUAGE PatternGuards #-}
m (w, es) | Just nsubj <- lookup "nsubj" es, Just dobj <- lookup "dobj" es = ...
| ...
| otherwise = error ...