4

関数を定義する

   pairMaybe :: Maybe a -> Maybe b -> Maybe (a,b)

両方の引数がであるJust場合にのみ結果を生成し、いずれかの引数がである場合。JustNothingNothing

私が思いついた:

pairMaybe (Just a) (Just b) = Just (a,b)
pairMaybe (Just a) Nothing = Nothing
pairMaybe Nothing (Just b) = Nothing

この書き方が正しいかどうかはわかりません。これに何か問題がありますか、それともこの関数を定義する方法ですか?

また、この関数が実際にできることのより良い説明が必要だと思うので、2 つの引数で呼び出した場合pairMaybe、それらはどのような引数になるのでしょうか? もちろん、それらは typeMaybeである必要がありますが、良い例は何ですか?

4

3 に答える 3

19

これをパターン マッチングで行うことは問題ありません。を使用してコードを簡素化できます

pairMaybe :: Maybe a -> Maybe b -> Maybe (a,b)
pairMaybe (Just a) (Just b) = Just (a,b)
pairMaybe _        _        = Nothing

そうは言っても、関数は実際には(,)関数 (2 タプルを作成する) をMaybeモナドに持ち上げるだけなので、次のように書くこともできます。

pairMaybe :: Maybe a -> Maybe b -> Maybe (a,b)
pairMaybe = liftM2 (,)
于 2013-11-29T22:25:33.327 に答える
6

両方の値があるパターンを見逃しましたNothing(どのパターンとも一致しません):

pairMaybe Nothing Nothing = Nothing

それ以外では、パターン マッチングは Haskell で物事を成し遂げる優れた方法です。

于 2013-11-29T22:23:36.590 に答える
2

素晴らしく見える!少し短くすることはできますが。

pairMaybe (Just a) (Just b) = Just (a,b)
pairMaybe _        _        = Nothing

これにより、Simeon が指摘したバグも修正されます。このように単純化できる理由は、右辺がすべてNothing同じであるため、これらのケースを 1 つにマージできるからです。

于 2013-11-29T22:25:58.700 に答える