ツリー上で解析コードを書いています。(つまり、スタンフォードの 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 モナドに基づく何らかの魔法があるのでしょうか..?