問題にはいくつかの解決策があり、すべてパターン マッチングに基づいています。私はあなたが 2 つのアルゴリズムを持っていると仮定しています (あなたがそれらに名前を付けていないので、私はそうします):
algorithm1 :: a -> Maybe b
algorithm2 :: b -> c
input :: a
1)パターン マッチングは通常、case ステートメント (下記) または関数のいずれかから行われます。
let val = algorithm1 input
in case val of
Nothing -> defaultValue
Just x -> algorithm2 x
提示された他のすべてのソリューションはパターン マッチングを使用します。パターン マッチングを実行する標準関数を提示しているだけです。
2) プレリュード (および Data.Maybe) には、Maybe
s を処理するための組み込み関数がいくつかあります。多分関数は素晴らしいものです。使用することをお勧めします。 標準ライブラリでは次のように定義されています。
maybe :: c -> (b -> c) -> Maybe b -> c
maybe n _ Nothing = n
maybe _ f (Just x) = f x
コードは次のようになります。
maybe defaultValue algorithm2 (algorithm1 input)
3) Maybe はファンクターなので、 fmapを使用できます。デフォルト値がない場合、これはより理にかなっています。定義:
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just a) = Just (f a)
したがって、コードは次のようになります。
fmap algorithm2 (algorithm1 input)
この出力はMaybe
値になります ( Nothing
algorithm1 の結果が の場合Nothing
)。
4) 最後に、強くお勧めしませんが、 ですfromJust
。最初のアルゴリズムが返されるJust x
(および返されないNothing
) 場合にのみ使用してください。気をつけて!fromJust val
whenを呼び出すとval = Nothing
例外が発生しますが、これは Haskell では歓迎されません。その定義:
fromJust :: Maybe b -> b
fromJust Nothing = error "Maybe.fromJust: Nothing" -- yuck
fromJust (Just x) = x
コードを次のように残します。
algorithm2 (fromJust (algorithm1 input))