【问题标题】:"fromJust" vs. "Just =" in HaskellHaskell 中的“fromJust”与“Just =”
【发布时间】:2014-05-22 18:55:04
【问题描述】:

Haskell 新手在这里。我试图从 Haskell 的 diagrams 库中理解 this 示例。具体来说,有这样一行:

Just t = <thing> 其中<thing> 的类型为Maybe (Tree a)

我不明白这是在做什么。我知道我们需要从Maybe 中获取价值。我用

替换了那行代码

t = fromJust <thing>

它的工作原理是一样的。这两行有什么区别吗,谁能解释一下第一行是做什么的?

【问题讨论】:

  • 旁注:考虑使用fmap 而不是fromJustJust t = ...
  • 两者之间有一个语义上没有出现的细微差别:当...Nothing 时,Just t = ... 会给你一个错误,其中一行指向那个模式; t = fromJust ... 会给你一个错误,其中一行指向 fromJust 的实现。
  • 区别在于fromJustpointfree 表达式链中的使用方便。
  • 正如 Daniel 所说:模式匹配方法使得程序因无用的I'm so sorry 而死亡和带有源代码位置的有用错误消息之间存在差异。避免fromJust

标签: haskell maybe


【解决方案1】:

fromJust 几乎等同于:

fromJust :: Maybe a -> a
fromJust (Just t) = t

请注意,它是相同的pattern match!如果您确定您的Maybe 将成为Just 而不是Nothing,则可以使用fromJust 在不进行模式匹配的情况下获取其值,但在大多数情况下匹配更清晰,所以您不要这里不需要。

【讨论】:

  • 对 OP 的重言式注释:如有疑问,假设您确定 Maybe 将成为 Just。此外,在这种情况下匹配更清晰的一个原因是因为它使您更明显地跳过了一个案例。 GHC 甚至可以通过标志-fwarn-incomplete-patterns 警告您,如果您使用fromJust,则不会发生这种情况。
【解决方案2】:

虽然两种形式的目的相同,

万一出现意外错误,模式匹配表将为您提供更好的错误位置线索。 (fromJust 错误异常是从 fromJust 内部抛出的,而失败的模式匹配会为您提供不完整代码的文件、行和列)

$ ghci
Prelude> :m +Data.Maybe

Prelude Data.Maybe> let t = fromJust Nothing
Prelude Data.Maybe> t
*** Exception: Maybe.fromJust: Nothing

Prelude Data.Maybe> let Just t = Nothing
Prelude Data.Maybe> t
*** Exception: <interactive>:7:5-20: Irrefutable pattern failed for pattern Data.Maybe.Just t

【讨论】:

    【解决方案3】:

    当您非常确定 Maybe 类型将返回 Just 值时,您可以进行模式匹配并提取该值。

    例子:

    Just t = Just 3 会将值 3 赋值给 t。您可以在ghci 中加载它并自己验证。 fromJust也一样,只不过更多的是功能应用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多