Haskellでは、タイプa -> Maybe b
を使用して、タイプの値を返すかb
、何も返さない(失敗する)関数をモデル化できます。
私がタイプしている場合a1, ..., a(n+1)
や機能f1, ..., fn
を持つ、fi :: ai -> Maybe a(i+1)
すべてのためにi
、1 <= i <= n
私は使用して機能をチェーンできる>>=
のオペレータMaybe
モナドと書き込みを:
f1 x >>= f2 >>= f3 >>=... >>= fn
>>=
各関数があれば、その前身は、意味のある値を返したように適用されていることをオペレータを確実にします。チェーン内の関数が失敗するとすぐに、チェーン全体が失敗し(戻り値Nothing
)、チェーン内の以降の関数は評価されません。
同じ入力で複数の関数を試し、1つの関数が成功したらすぐに戻りたいという似たようなパターンがあります。すべての関数が失敗すると(return Nothing
)、計算全体が失敗します。より正確には、私には関数がf1, ..., fn :: a -> Maybe b
あり、関数を定義します
tryFunctions :: [a -> Maybe b] -> a -> Maybe b
tryFunctions [] _ = Nothing
tryFunctions (f : fs) x = case f x of
Nothing -> tryFunctions fs x
r@(Just _) -> r
ある意味では、これはMaybe
モナドと二重であり、最初の失敗ではなく最初の成功で計算が停止します。
もちろん、上で書いた関数を使用することもできますが、Haskellでこのパターンを表現するためのよりよく確立された慣用的な方法があるかどうか疑問に思いました。
Alternative
これは、シンボルのインフィックス演算子で<|>
あり、モノイドの観点から定義されています
return f1 ?? f2 ?? f3 ?? DefaultValue;