Вы, вероятно, имели в виду iterate
:
*Main> take 8 $ iterate (^2) (0.0 ::Float)
[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]
*Main> take 8 $ iterate (^2) (0.001 ::Float)
[1.0e-3,1.0000001e-6,1.0000002e-12,1.0000004e-24,0.0,0.0,0.0,0.0]
*Main> take 8 $ iterate (^2) (0.999 ::Float)
[0.999,0.99800104,0.9960061,0.9920281,0.9841198,0.96849173,0.93797624,0.8797994]
*Main> take 8 $ iterate (^2) (1.0 ::Float)
[1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0]
*Main> take 8 $ iterate (^2) (1.001 ::Float)
[1.001,1.002001,1.0040061,1.0080284,1.0161213,1.0325024,1.0660613,1.1364866]
Здесь у вас есть вся история выполнения, явно доступная для вашего анализа. Вы можете попытаться обнаружить фиксированную точку с помощью
fixed f from = snd . head
. until ((< 1e-16).abs.uncurry (-).head) tail
$ _S zip tail history
where history = iterate f from
_S f g x = f x (g x)
, а затем
*Main> fixed (^2) (0.999 :: Float)
0.0
, но попытка fixed (^2) (1.001 :: Float)
будет повторяться бесконечно, поэтому вам потребуется разработать отдельное тестирование на сходимость, и даже тогда обнаружение отталкивающих фиксированных точек, таких как 1.0, потребует более тщательного изучения.