2013-03-15 207 views
2

我在树上写了一些解析代码。 (即在斯坦福NLP依赖关系树)Haskell模糊模式匹配调度

基本上我有这样的功能:

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" 

我想是派遣到第一个规则,如果节点有一个nsubjdobj边缘走出来的它。我不在乎它还有什么。

很明显,我的示例函数没有这样做,因为它需要边以正确的顺序出现,而且如果存在更多的边,它将不匹配。

一种方法可以是使用警卫更多的表现力,我可以这样做:

m (w, es) | (isJust.lookup "nsubj") es && (isJust.lookup "dobj") es = ... 
      | ... 
      | otherwise = error ... 

但是,这是一个很多paintful,我甚至不得到目标节点上的手柄。

有没有一种标准的方式来写图案匹配解析器在像我这样的图上?或者也许有一些基于Maybe monad的魔法..?

回答

6

您可以使用pattern guards

{-# LANGUAGE PatternGuards #-} 

m (w, es) | Just nsubj <- lookup "nsubj" es, Just dobj <- lookup "dobj" es = ... 
      | ... 
      | otherwise = error ... 
+3

@ dave4420:虽然它可能是很好的做法,包括编译,图案卫兵自2010年Haskell的标准,因此在默认情况下启用GHC。 – hammar 2013-03-15 22:18:21

+0

我没有意识到。我很抱歉。 – dave4420 2013-03-15 22:26:44