定义功能
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
的所有右手边都是相同的,所以这些情况可以合并为一个。