当我尝试编译这段代码时
prod [] = 1
prod (x:xs) = x * prod xs
ff :: (Num a) => a -> a -> a
ff x n = prod [(x - n + 1) .. x]
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
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]
Run Code Online (Sandbox Code Playgroud)
这段代码有什么问题?当我替换Double一切都没事的时候.
[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]
Run Code Online (Sandbox Code Playgroud)
它适用于Double因为Double实现这两个类型.