Эта ошибка произойдет только тогда, когда левый интервал суммы Реймана начинается с 0 из-за строки:
in dx * (sum [f x | x <- [a,a+dx..b-dx]])
f x
, если ваша theFunc
функция становится theFunc 0
и 1/0^2
is infinity
Поскольку с математической точки зрения существует асимптота в 0, это поведение является правильным. Если вместо этого вы хотите сделать вид, что значение в 0 не вносит вклад в интеграл, то мы можем добавить защиту для нуля, например, так:
theFunc :: Float -> Float
theFunc x
| x == 0.0 = 0.0
| otherwise = 1.0 / x^2
Вызывается как:
leftSum 0 2 theFunc 1000