2 つの関数を考えてみましょう。
f :: a -> Maybe b
g :: b -> Maybe c
この関数は、 そうでない場合にのみの結果で実行>>=
されるように機能します。つまり、結果を出すにはとの両方が必要です。f >>= g
g
f
Nothing
f
g
私はパーサーを実装していますが、私のレクサーはこれとは逆の利点があることに気付きました。あれは:
f :: a -> Maybe b
g :: a -> Maybe b
planb :: (a -> Maybe b) -> (a -> Maybe b) -> (a -> Maybe b)
planb f g = \x -> case f x of
Nothing -> g x
res -> res
つまりf
、試行して失敗した場合はg
、バックアップ プランとして試行します。lexer では、トークン タイプを現在の入力と一致させようとすることを意味し、失敗した場合は別のトークン タイプと一致させようとします (最終的にはすべてのトークン タイプにチェーンされます)。
Hoogle で検索しても、そのような機能はありませんでしたが、私には、このような機能は多くの場所で役立つようです。
planb
したがって、私の質問は、使用すべきバリアントが既に存在するかどうかです。そうでない場合、私は何か特別なことをしているのでしょうか?また、私が望むものを達成するためのより良い方法はありますか?
PS 私はそのような関数が一般的に s にとって意味があるかどうかを考えましMonad
たが、それは私の外ではあまり意味がありませんMaybe
。