【问题标题】:Can Maybe be used for optional arguments?Maybe 可以用于可选参数吗?
【发布时间】:2015-11-02 17:06:50
【问题描述】:

我无法让以下内容在 GHCi 中工作。这是一个在网上弹出几个地方的简短示例。

import Data.Maybe

elseZero :: (Num a) => Maybe a -> a
elseZero n = fromMaybe 0 n

我的理解是,当我将它加载到 GHCi 中然后使用 elseZero 运行时,它应该返回 0,因为没有给出任何参数。

但我收到错误:

Non type-variable argument in the constraint: Num (Maybe a)
(Use FlexibleContexts to permit this)
When checking that `it' has the inferred type
  it :: forall a. (Num a, Num (Maybe a)) => a

Haskell 的 Monadic 的所有部分都是新的。感谢您的帮助!

【问题讨论】:

  • 您的问题源于对fromMaybe 的误解以及对elseZero 的类型签名的混淆:elseZero 是一个需要一个参数的函数(Maybe a)。如果您尝试评估它而不提供Maybe a 类型的值,GHCi 会抱怨。 elseZero Nothing 返回0,因为无法从Nothing 中提取任何值。
  • Maybe a 不是可选参数,您必须提供 Maybe a 类型的值,例如fromMaybe NothingfromMaybe (Just 3).
  • 谢谢@Jubobs。查看 Just (a -> Maybe a) 和 Nothing 数据构造函数的类型非常有帮助。我希望通过使可选函数参数采用默认值来使用 Maybe 来清理一些代码。我现在看到这需要使用 Just 或辅助函数。
  • @todkwxrtvwmzonunswam 你可能会喜欢 Brent Yorgey 在incremental ad-hoc parameter abstraction 上的帖子。

标签: haskell monads maybe


【解决方案1】:

elseZero 的类型是(Num a) => Maybe a -> a,所以这就是 GHCi 将尝试show 你。但是,函数不是 showable,这是错误消息告诉您的。

您的根本误解似乎是您认为elseZeroelseZero Nothing 是相同的。但前者是(Num a) => Maybe a -> a 类型的函数,它返回Just-value 或0,而后者是(Num a) => a 类型的0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2011-04-15
    • 2016-03-25
    • 1970-01-01
    相关资源
    最近更新 更多