0
我在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的单子。谢谢你的帮助!
你的问题源于对['fromMaybe'](http://hackage.haskell.org/package/base-4.8.1.0/docs/Data-Maybe.html#v:fromMaybe)的误解,以及对'elseZero'的类型签名:'elseZero'是一个需要一个参数('Maybe a')的函数。 GHCi会投诉,如果你尝试评估它,而不提供它的价值'可能a'。 'elseZero Nothing'返回'0',因为没有值可以从'Nothing'中提取。 – Jubobs
'也许a'不是一个可选的参数,你必须提供一个'Maybe a'类型的值,例如“从可能没有”或“从可能(只有3)”。 – Lee
谢谢@Jubobs。查看Just(a - > Maybe a)和Nothing数据构造函数的类型非常有用。我希望使用Maybe作为通过使可选函数参数采用默认值来清除一些代码的一种方式。我现在看到,这将要求使用Just或辅助函数。 – todkwxrtvwmzonunswam