Я пытаюсь скомпилировать следующую функцию в 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..]
как тип Enum и как это исправить. Имейте в виду, что здесь я хочу воспользоваться преимуществами ленивых вычислений, отсюда и бесконечный список.
diff [] = []
илиdiff [_] = [0]
? В конце концов, взятие четвертого дифференциала x^2+1 должно быть константой 0, а не ошибкой. - person ephemient   schedule 07.10.2009[1..]
, а не[0..]
, чтобы он правильно различался. - person Zaid   schedule 07.10.2009