Я пытаюсь скомпилировать следующую функцию в Haskell, чтобы имитировать дифференцирование многочлена, константы которого указаны в числовом списке:
diff :: (Num a) => [a] -> [a]
diff [] = error "Polynomial unspecified"
diff coeff = zipWith (*) (tail coeff) [0..]
Хаскелл отказывается его компилировать, объясняя мне причину:
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..]
как тип Enum, и как я могу это исправить. Имейте в виду, что я хочу воспользоваться преимуществами ленивых вычислений, отсюда и бесконечный список.