2013-03-15 206 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