【问题标题】:Fuzzy Pattern Matching Dispatch in HaskellHaskell 中的模糊模式匹配调度
【发布时间】:2013-03-15 21:52:25
【问题描述】:

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

【问题讨论】:

    标签: haskell tree pattern-matching maybe pattern-guards


    【解决方案1】:

    你可以使用pattern guards:

    {-# LANGUAGE PatternGuards #-}
    
    m (w, es) | Just nsubj <- lookup "nsubj" es, Just dobj <- lookup "dobj" es = ...
              | ...
              | otherwise = error ...
    

    【讨论】:

    • @dave4420:虽然包含 pragma 可能是一种很好的做法,但模式保护是自 Haskell 2010 以来的标准配置,因此在 GHC 中默认启用。
    • 我没有意识到这一点。我很抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2021-05-22
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2021-12-24
    • 2017-07-09
    相关资源
    最近更新 更多