我正在树上编写一些解析代码。 (即斯坦福大学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 ...
但这要画得多,而且我什至没有掌握目标节点。
有没有一种标准的方法可以在像我这样的图上编写模式匹配解析器?或者,也许有一些基于Maybe monad的魔法。
最佳答案
您可以使用pattern guards:
{-# LANGUAGE PatternGuards #-}
m (w, es) | Just nsubj <- lookup "nsubj" es, Just dobj <- lookup "dobj" es = ...
| ...
| otherwise = error ...