2

我正在在一棵树上编写一些解析代码。(即斯坦福 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 的魔法..?

4

1 回答 1

6

您可以使用模式防护

{-# LANGUAGE PatternGuards #-}

m (w, es) | Just nsubj <- lookup "nsubj" es, Just dobj <- lookup "dobj" es = ...
          | ...
          | otherwise = error ...
于 2013-03-15T22:00:35.497 回答