如果两个参数都是Just,则Haskell函数返回Just对值,否则返回Nothing



定义功能

   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,它们可以是什么参数?当然,它们必须是Maybe类型,但有什么好的例子呢?

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

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

也就是说,您的函数实际上只是将(,)函数(创建2元组)提升到Maybe monad中,因此您也可以编写

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

您错过了两个值都是Nothing的模式(这与您的任何模式都不匹配):

pairMaybe Nothing Nothing = Nothing

除此之外,模式匹配是在Haskell中完成任务的好方法。

看起来很棒!虽然你可以把它缩短一点。

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

这也修复了Simeon指出的错误。你可以这样简化它的原因是Nothing的所有右手边都是相同的,所以这些情况可以合并为一个。

最新更新