2015-11-02 46 views
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的单子。谢谢你的帮助!

+3

你的问题源于对['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

+4

'也许a'不是一个可选的参数,你必须提供一个'Maybe a'类型的值,例如“从可能没有”或“从可能(只有3)”。 – Lee

+1

谢谢@Jubobs。查看Just(a - > Maybe a)和Nothing数据构造函数的类型非常有用。我希望使用Maybe作为通过使可选函数参数采用默认值来清除一些代码的一种方式。我现在看到,这将要求使用Just或辅助函数。 – todkwxrtvwmzonunswam

回答

1

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

你的根本误解似乎是你认为elseZeroelseZero Nothing是一样的。但前者是(Num a) => Maybe a -> a类型的函数,返回Just值或0,后者为(Num a) => a类型的0。