Отправка нечетких шаблонов в 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 ...
Другие вопросы по тегам