当我尝试编译这段代码时
prod [] = 1
prod (x:xs) = x * prod xs
ff :: (Num a) => a -> a -> a
ff x n = prod [(x - n + 1) .. x]
我收到以下错误:
a.hs:5:15:
Could not deduce (Enum a)
arising from the arithmetic sequence `(x - n + 1) .. x'
from the context (Num a)
bound by the type signature for ff :: Num a => a -> a -> a
at a.hs:5:1-32
Possible fix:
add (Enum a) to the context of
the type signature for ff :: Num a => a -> a -> a
In the first argument of `prod', namely `[(x - n + 1) .. x]'
In the expression: prod [(x - n + 1) .. x]
In an equation for `ff': ff x n = prod [(x - n + 1) .. x]
这段代码有什么问题?当我用Double
代替一切都没问题时。
答案 0 :(得分:7)
[i .. j]
是enumFromTo i j
的简写。 enumFromTo
是Enum
类型类的一部分,而不是Num
的一部分(您仍然需要Num
才能使用+
和-
。
所以你需要说a
实现Enum
以及实施Num
:
ff :: (Num a, Enum a) => a -> a -> a
ff x n = prod [(x - n + 1) .. x]
它与Double
一起使用,因为Double
实现了这两个类型类。
答案 1 :(得分:2)
为了使[x .. y]
有效,结果类型根本不需要是Num
个实例(例如,['A'..'Z']
工作正常)。它必须是Enum
实例。只需将Enum
添加到类型签名。
它适用于Double
,因为Double
有两个实例。
答案 2 :(得分:1)
ff :: (Enum a, Num a) => a -> a -> a
ff x n = prod [(x - n + 1) .. x]