16

戻り値の型を持つ関数がありますMaybe ([(Int,Int)],(Int,Int))

これを別の関数から呼び出して、データに対して操作を実行したいと思います。

ただし、戻り値は 内に含まれていますJust。2 番目の方法は([(Int,Int)],(Int,Int))を使用するため、受け入れられませんJust ([(Int,Int)],(Int,Int))

Just2番目の方法を適用する前にトリミングできる方法はありますか?

Justwithinの使用を完全には理解していませんMaybeが、最初の Method の戻り値の型は でなければならないと言われましたMaybe

4

2 に答える 2

51

問題にはいくつかの解決策があり、すべてパターン マッチングに基づいています。私はあなたが 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) には、Maybes を処理するための組み込み関数がいくつかあります。多分関数は素晴らしいものです。使用することをお勧めします。 標準ライブラリでは次のように定義されています。

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値になります ( Nothingalgorithm1 の結果が の場合Nothing)。

4) 最後に、強くお勧めしませんが、 ですfromJust。最初のアルゴリズムが返されるJust x(および返されないNothing) 場合にのみ使用してください。気をつけて!fromJust valwhenを呼び出すとval = Nothing例外が発生しますが、これは Haskell では歓迎されません。その定義:

fromJust          :: Maybe b -> b
fromJust Nothing  = error "Maybe.fromJust: Nothing" -- yuck
fromJust (Just x) = x

コードを次のように残します。

algorithm2 (fromJust (algorithm1 input))
于 2010-07-30T22:07:03.277 に答える
5

を探していfromJustます。ただし、関数が!を返さないことが確実な場合に限ります。MaybeNothing

于 2010-07-30T21:35:00.633 に答える