如果两个参数都是Just,则Haskell函数只返回一对值,否则不返回任何值

如果两个参数都是Just,则Haskell函数只返回一对值,否则不返回任何值,haskell,maybe,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 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
,它们可以是什么参数?当然,它们必须是
类型,可能是
,但有什么好的例子吗?

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


除此之外,模式匹配是在Haskell中完成事情的一种很好的方法。

通过模式匹配完成这一点很好;您可以通过使用

pairMaybe :: Maybe a -> Maybe b -> Maybe (a,b)
pairMaybe (Just a) (Just b) = Just (a,b)
pairMaybe _        _        = Nothing
也就是说,您的函数实际上只是将
(,)
函数(它创建了两个元组)提升到
Maybe
单子中,因此您还可以编写

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

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

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

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

嘿,我真傻,忘了。。。但除此之外,这实际上还可以吗?:)对不起,我有点震惊,对你来说很陌生haskell@SuzanAydın:有了这个加法,它是完全正确的,尽管你实际上只需要两个例子:
pairMaybe(Just a)(Just b)
pairMaybe_uuuu
-因为所有其他例子都给出相同的结果,你可以把它们放在一起。@SuzanAydın是的,我觉得很好。我认为
pairmabe
可用于检查是否存在两个值,如果不存在,则继续执行
Nothing
。如果您想知道代码是否有效,可以将其输入到文件中,并使用
:load yourfile.hs
将其加载到GHCi中,然后自己测试该函数。如果您要求进行代码审查(即专家意见和改进建议),那么很遗憾,您的网站错了!你的运气可能更好。我知道如何检查代码是否有效,它确实有效,但我更想知道它实际上是用来做什么的,而不是它是否编译或不编译。你知道如何测试它吗?我试过pairMaybe 5 6之类的东西,但如果抱怨它不能推断类型…@SuzanAydın:嗯
pairMaybe 5 6
不进行类型检查,你可能是指
pairMaybe(仅5)(仅6)
。也就是说,如果您使用的是基于
liftM2
的版本,请确保包含一个类型签名,否则编译器无法决定要推断的类型签名。
pairMaybe (Just a) (Just b) = Just (a,b)
pairMaybe _        _        = Nothing