[英]Why does Haskell interpret my Num type as an Enum?
I'm trying to compile the following function in Haskell to mimic differentiation of a polynomial whose constants are specified in a numerical list: 我正在尝试在Haskell中编译以下函数,以模仿在数值列表中指定常量的多项式的区分:
diff :: (Num a) => [a] -> [a]
diff [] = error "Polynomial unspecified"
diff coeff = zipWith (*) (tail coeff) [0..]
Haskell refuses to compile it, giving me the following reason: Haskell拒绝编译它,给出了以下原因:
Could not deduce (Enum a) from the context (Num a)
arising from the arithmetic sequence `0 .. ' at fp1.hs:7:38-42
Possible fix:
add (Enum a) to the context of the type signature for `diff'
In the third argument of `zipWith', namely `[0 .. ]'
In the expression: zipWith (*) (tail coeff) ([0 .. ])
In the definition of `diff':
diff coeff = zipWith (*) (tail coeff) ([0 .. ])
Why is Haskell treating the [0..]
list as an Enum type, and how can I fix this. 为什么Haskell将[0..]
列表视为Enum类型,我该如何解决这个问题。 Bear in mind that I want to take advantage of lazy evaluation here, hence the infinite list. 请记住,我想利用这里的懒惰评估,因此无限列表。
[0..]
is syntactic sugar for enumFrom 0
, defined in class Enum
. [0..]
是enumFrom 0
语法糖,在Enum
类中定义。 Because you want to generate a list of a
s with [0..]
the compiler demands a
to be in class Enum
. 因为要生成的列表a
以s [0..]
编译器需要a
要在类Enum
。
You can either add the Enum a
to the type signature of the function or work around it by generating a [0..] :: [Integer]
and using fromInteger
(which is defined in class Num
) to get a [a]
from that: 您可以将Enum a
添加到函数的类型签名中,也可以通过生成[0..] :: [Integer]
并使用fromInteger
(在类Num
定义)从中获取[a]
来解决该问题。 :
diff :: (Num a) => [a] -> [a]
diff [] = error "Polynomial unspecified"
diff coeff = zipWith (*) (tail coeff) (map fromInteger [0..])
The correct type of diff
has to be 必须有正确的diff
类型
diff :: (Num a, Enum a) => [a] -> [a]
because the usage of [x..]
requires the type to instantiate Enum
. 因为[x..]
要求类型实例化Enum
。
[0..]
是enumFrom 0
缩写, 请参见此处
Here's a quick summary of what the compiler sees when it looks at this function: 以下是编译器在查看此函数时看到的内容的快速摘要:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.