【问题标题】:Haskell function returning Just pair of values if both arguments are Just, Nothing otherwise如果两个参数都是 Just,则 Haskell 函数返回 Just 值对,否则返回 Nothing
【发布时间】:2013-11-29 22:20:42
【问题描述】:

定义一个函数

   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 类型,但有什么好的例子呢?

【问题讨论】:

  • 如果您想知道代码是否有效,您可以将其输入文件并使用:load yourfile.hs将其加载到GHCi中并自行测试功能。如果您要求进行代码审查(即专家意见和改进建议),很遗憾您最终进入了错误的站点!在codereview.SE 上你可能会有更好的运气。
  • 我知道如何检查代码是否有效,并且确实有效,但我更多地考虑它的实际用途,而不是它是否编译

标签: haskell maybe


【解决方案1】:

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

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 (,)

【讨论】:

  • 另外,知道如何测试它吗?我尝试了类似 pairMaybe 5 6 但如果抱怨它无法推断类型...
  • @SuzanAydın:嗯,pairMaybe 5 6 没有类型检查,你可能是说pairMaybe (Just 5) (Just 6)。话虽如此,如果您使用的是基于 liftM2 的版本,请确保包含类型签名,否则编译器无法决定要推断的类型签名。
【解决方案2】:

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

pairMaybe Nothing Nothing = Nothing

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

【讨论】:

  • 嘿,愚蠢的我忘记了...但除此之外,实际上还可以吗? :) 对不起,我有点震惊,对 haskell 很陌生
  • @SuzanAydın:有了这个添加,它是完全正确的,虽然你实际上只需要两个案例:pairMaybe (Just a) (Just b)pairMaybe _ _ - 因为所有其他案例给出相同的结果,你可以把它们放在一起.
  • @SuzanAydın 是的,我觉得很好。我认为pairMaybe 可用于检查是否存在两个值,如果不存在,则继续使用Nothing
【解决方案3】:

看起来不错!虽然你可以缩短一点。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2019-11-23
    • 2019-06-12
    • 1970-01-01
    相关资源
    最近更新 更多