2

ツリー上で解析コードを書いています。(つまり、スタンフォードの 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です。他に何があるかは気にしません。

エッジが正しい順序で存在する必要があり、さらにエッジが存在する場合は一致しないため、明らかに私の例の関数はこれを行いません。

1 つのアプローチとして、表現力を高めるためにガードを使用することが考えられます。

m (w, es) | (isJust.lookup "nsubj") es && (isJust.lookup "dobj") es = ...
          | ...
          | otherwise = error ...

しかし、それはかなり面倒で、ターゲット ノードのハンドルさえ取得できません。

私のようなグラフにパターン マッチング パーサーを記述する標準的な方法はありますか? それとも、Maybe モナドに基づく何らかの魔法があるのでしょうか..?

4

1 に答える 1

6

パターンガードを使用できます:

{-# LANGUAGE PatternGuards #-}

m (w, es) | Just nsubj <- lookup "nsubj" es, Just dobj <- lookup "dobj" es = ...
          | ...
          | otherwise = error ...
于 2013-03-15T22:00:35.497 に答える