Haskell中的模糊模式匹配调度

Haskell中的模糊模式匹配调度,haskell,tree,pattern-matching,maybe,pattern-guards,Haskell,Tree,Pattern Matching,Maybe,Pattern Guards,我正在树上写一些解析代码。(即斯坦福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边,我想要分派到

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

您可以使用:

{-#语言模式卫士}

m(w,es)| Just nsubj@dave4420:虽然包含pragma可能是一种良好的做法,但自Haskell 2010年以来,模式保护是标准的,因此在GHC中默认启用。我没有意识到这一点。我道歉。
{-# LANGUAGE PatternGuards #-}

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