Haskell中的模糊模式匹配调度

Tho*_*hle 2 tree haskell 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"
Run Code Online (Sandbox Code Playgroud)

我想要的是,如果节点有一个nsubj和一个dobj边缘出来,则调度到第一个规则.我不在乎它可能有什么.

很明显,我的示例函数不会这样做,因为它要求边以正确的顺序存在,如果存在更多的边,它将不匹配.

一种方法可能是使用警卫来提高表现力,我可以这样做:

m (w, es) | (isJust.lookup "nsubj") es && (isJust.lookup "dobj") es = ...
          | ...
          | otherwise = error ...
Run Code Online (Sandbox Code Playgroud)

但这更加富有成效,我甚至无法处理目标节点.

是否有一种标准方法可以像我一样在图形上编写模式匹配解析器?或者也许是基于Maybe monad的魔法......?

ham*_*mar 6

你可以使用图案防护:

{-# LANGUAGE PatternGuards #-}

m (w, es) | Just nsubj <- lookup "nsubj" es, Just dobj <- lookup "dobj" es = ...
          | ...
          | otherwise = error ...
Run Code Online (Sandbox Code Playgroud)

  • @ dave4420:虽然包含pragma可能是一种很好的做法,但是自Haskell 2010以来模式保护是标准的,因此在GHC中默认启用. (3认同)