4,1 корня Ньютона-Рафсона
Эти две строки
sqroot a0 eps n = within eps (iterate (next n) a0)
relativesqrt a0 eps n = relative eps (iterate (next n) a0)
почти идентичны, так что вы можете абстрагироваться еще на шаг дальше:
sqroot method a0 eps n = method eps (iterate (next n) a0)
relativesqrt = sqroot relative
withinsqrt = sqroot within
4.2 Числовое дифференцирование
Я не вижу смысла в том, чтобы h0
являлся аргументом функции differentiate
, поскольку это всего лишь отправная точка для ограничивающей последовательности 0
. (То же самое не верно для a0
в случае Ньютона-Рапсона, где может иметь значение отправная точка).
Я думаю, что одинаково уместно абстрагироваться от скорости, с которой этот предел приближается к нулю:
differentiate rate f x = map (easydiff f x) (iterate rate 1)
Конечно, можно сделать и то и другое:
differentiate rate h0 f x = map (easydiff f x) (iterate rate h0)
В любом случае, это довольно произвольное решение.
4.2 Интеграция
Вы можете использовать
zipWith (+) (integ f a m fa fm) (integ f m b fm fb)
вместо
map (uncurry (+)) (zip (integ f a m fa fm) (integ f m b fm fb))
который я считаю более читабельным.