【问题标题】:Haskell unwrap Maybe keep polymorphismHaskell unwrap 也许保持多态性
【发布时间】:2018-10-20 06:46:53
【问题描述】:

Haskell 初学者又来了。如果我想解开 Maybe 类型并保持抽象,我会使用:

fUnwrap :: Maybe a -> a 
fUnwrap (Just n) = n 
fUnwrap Nothing = ???

无论我如何处理Nothing,编译器都会不停地唠叨要更具体地处理Nothing...你们能帮帮我吗?

【问题讨论】:

  • 这不是一个好主意。您可以为Nothing 添加默认值,也可以忽略该行,但如果它是Maybe,则会收到错误消息。
  • 您想在这里解决更大的问题吗?如果有,你能描述一下吗?

标签: haskell maybe unwrap


【解决方案1】:

这是合乎逻辑的。编译器预计a 类型的值,但这里没有您可以提供的值,因为a 可以是任何值(BoolInt[Int]Maybe Int 等)。

这不是一个编程问题,它更像是一个设计问题:如果是Nothing,你想做什么?这里有一些选项:

  1. 提供一个默认值,那么签名就是:

    fUnwrap :: a -> Maybe a -> a 
    fUnwrap _ (Just n) = n
    fUnwrap d Nothing = d
  2. 如果是Nothing,我们会引发错误(我们可以这样做,既可以省略行,也可以明确引发错误,尽管在后一种情况下我们可以指定原因):

    fUnwrap :: Maybe a -> a
    fUnwrap (Just n) = n
    fUnwrap Nothing = error "Nothing has no value"
  3. 我们返回undefined:

    fUnwrap :: Maybe a -> a
    fUnwrap (Just n) = n
    fUnwrap Nothing = undefined

    undefined :: a 是一个在评估时会引发错误的对象。因此它是error 的一个特例,但我们会“推迟”评估,这样如果不需要该值,我们就不会收到错误。

但我个人认为第一种方法在这里是可取的,因为函数签名没有指定它们会引发错误,因此会导致代码可能会失败,而没有任何提示。

Maybe a 通常用作可能“失败”的计算的结果类型:如果成功,则返回 Just x(结果为 x),否则返回 Nothing

您可以使用例如do 表示法从可能失败的计算链中构造Maybe a。例如:

foo :: Int -> Maybe Int
foo x = do
    y <- someComputation x
    otherComputation y

这里以someComputation, otherComputation :: Int -&gt; Maybe Int为例。

【讨论】:

  • 非常清楚威廉!我真正需要的是您的示例 1。正如您所指出的,只是不希望用户遇到 Nothing 并通过使用默认值来捕获它。也非常感谢您将其放在上下文中并指出我拥有的其他选项。
  • 将 Maybe 限制为 Monoid 有什么问题?展开没有什么会返回空的
  • @AnthonyRaimondo: 是的,但这仅适用于Monoids,因为“原始”Ints 例如不是Monoids(以及Sum 和@987654348 @ are),因此这将导致在 monoid 构造函数中进行大量的包装和展开。
  • @Willem Van Onsem 有道理,感谢没有意识到 Int 不是幺半群!
【解决方案2】:

这是不可能的,因为您的函数是编写的。由于该函数是纯函数,因此您不能返回 a,因为您唯一的输入是 Nothing。

Maybe 的美妙之处在于您无需“打开”它。您可以使用 fmap 函数仅在包装数据存在时对其进行操作,并且在 Nothing 情况下隐式不执行任何操作。

【讨论】:

  • 我确实意识到我可以对 Maybe 类型进行操作,但重点是输出到例如。 JSON、XML。我不想要 Just's and Nothing 在那里,但实际上是价值观或“”。
  • @Madderote 在这种情况下使用maybe " " show。总是直接问你想知道什么。 :)
猜你喜欢
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 2011-05-06
  • 1970-01-01
相关资源
最近更新 更多