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

时间:2013-11-29 22:20:42

标签: haskell maybe

  

定义一个函数

   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类型,但这是一个很好的例子吗?

3 个答案:

答案 0 :(得分:19)

通过模式匹配来做这件事很好;您可以使用

简化代码
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 (,)

答案 1 :(得分:6)

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

pairMaybe Nothing Nothing = Nothing

除了模式匹配之外,还有一种在Haskell中完成工作的好方法。

答案 2 :(得分:2)

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

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

这也解决了Simeon指出的错误。您可以简化它的原因是Nothing的所有右侧都是相同的,因此这些案例可以合并为一个。