4

定义一个函数

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

仅当两个参数都是 时才会产生Just结果Just,并且Nothing如果任一参数都是Nothing

我想出了:

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

我不确定这是否是正确的写作方式。这有什么问题还是这是定义此功能的方式?

另外我想我可能想要更好地解释这个函数实际上可以做什么,所以如果我pairMaybe用两个参数调用,它们可以是什么参数?当然它们必须是 type Maybe,但有什么好的例子呢?

4

3 回答 3

19

通过模式匹配做到这一点很好;你可以通过使用来简化你的代码

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

话虽如此,您的函数实际上只是将(,)函数(创建 2 元组)提升到Maybemonad 中,因此您也可以编写

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都是相同的,所以这些案例可以合并为一个。

于 2013-11-29T22:25:58.700 回答