Haskell中的模糊模式匹配调度
我正在树上写一些解析代码。(即斯坦福nlp依赖树) 基本上我有这样一个函数: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边,我想要分派到
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 ...