所以我有这个简单的Haskell函数:
fact :: (Num a) => a -> a
fact 0 = 1
fact n = n * fact (n - 1)
当我尝试用GHCi编译它时,我收到一个错误:
test.hs:2:6: error:
• Could not deduce (Eq a) arising from the literal ‘0’
from the context: Num a
bound by the type signature for:
fact :: Num a => a -> a
at test.hs:1:1-25
Possible fix:
add (Eq a) to the context of
the type signature for:
fact :: Num a => a -> a
• In the pattern: 0
In an equation for ‘fact’: fact 0 = 1
Failed, modules loaded: none.
看,我知道有更好的方法来编写这个功能,但我不在乎。我只想让这个函数编译。我不能这样做。我的印象是,如果某个东西是数字,它必须是Eq a的一个实例,因此编译器对可能修复的建议是错误的。
如何编译此代码?
答案 0 :(得分:1)
您假设作为Num
实例的类型也必须是Eq
的实例,这是假的。考虑函数的推断类型:
> fact 0 = 1; fact n = n * fact (n - 1)
> :t fact
fact :: (Num t, Eq t) => t -> t
要成为Num
的实例,类型只需要定义以下函数:
(+)
(*)
abs
signum
fromInteger
negate
或(-)