I’m trying to compile the following function in Haskell to mimic differentiation of a polynomial whose constants are specified in a numerical list:
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:
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. Bear in mind that I want to take advantage of lazy evaluation here, hence the infinite list.
[0..]is syntactic sugar forenumFrom 0, defined in classEnum. Because you want to generate a list ofas with[0..]the compiler demandsato be in classEnum.You can either add the
Enum ato the type signature of the function or work around it by generating a[0..] :: [Integer]and usingfromInteger(which is defined in classNum) to get a[a]from that: