我正在尝试在Haskell中编译以下函数,以模仿在数值列表中指定常量的多项式的区分:
diff :: (Num a) => [a] -> [a]
diff [] = error "Polynomial unspecified"
diff coeff = zipWith (*) (tail coeff) [0..]
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 .. ])
为什么Haskell将[0..]
列表视为枚举类型,我该如何解决这个问题。请记住,我想利用这里的懒惰评估,因此无限列表。
答案 0 :(得分:8)
[0..]
是enumFrom 0
的语法糖,在类Enum
中定义。由于您希望使用a
生成[0..]
的列表,因此编译器要求a
位于类Enum
中。
您可以将Enum a
添加到该函数的类型签名中,也可以通过生成[0..] :: [Integer]
并使用fromInteger
(在类Num
中定义)来解决该问题。 )从中得到[a]
:
diff :: (Num a) => [a] -> [a]
diff [] = error "Polynomial unspecified"
diff coeff = zipWith (*) (tail coeff) (map fromInteger [0..])
答案 1 :(得分:7)
diff
的正确类型必须是
diff :: (Num a, Enum a) => [a] -> [a]
因为[x..]
的使用要求类型实例化Enum
。
答案 2 :(得分:3)
[0..]
是enumFrom 0
See here
答案 3 :(得分:2)
以下是编译器在查看此函数时看到的内容的快速摘要: