improve
:: (Fractional a
) => (a
-> b
) -> a
-> (a
, b
)improve f x =
let newX = x+0.1
in (newX, f newX)
step f goal x =
let
newX = x+0.1
err = f newX
in
if err < goal then (newX, err) else step f goal newX
optimize f goal = step f goal 0
main
= print $ optimize f
0.5
ZiA6OiAoTnVtIGEpID0+IGEgLT4gYQpmIHggPSBhYnMoNDIteCleMgoKaW1wcm92ZSA6OiAoRnJhY3Rpb25hbCBhKSA9PiAoYSAtPiBiKSAtPiBhIC0+IChhLCBiKQppbXByb3ZlIGYgeCA9CiAgICBsZXQgbmV3WCA9IHgrMC4xCiAgICBpbiAobmV3WCwgZiBuZXdYKQoKc3RlcCA6OiAoRnJhY3Rpb25hbCBhLCBPcmQgYikgPT4gKGEgLT4gYikgLT4gYiAtPiBhIC0+IChhLCBiKQpzdGVwIGYgZ29hbCB4ID0KICAgIGxldAogICAgICAgIG5ld1ggPSB4KzAuMQogICAgICAgIGVyciA9IGYgbmV3WAogICAgaW4KICAgICAgICBpZiBlcnIgPCBnb2FsIHRoZW4gKG5ld1gsIGVycikgZWxzZSBzdGVwIGYgZ29hbCBuZXdYCgpvcHRpbWl6ZSA6OiAoRnJhY3Rpb25hbCBhLCBPcmQgYikgPT4gKGEgLT4gYikgLT4gYiAtPiAoYSwgYikKb3B0aW1pemUgZiBnb2FsID0gc3RlcCBmIGdvYWwgMAoKbWFpbiA6OiBJTyAoKQptYWluID0gcHJpbnQgJCBvcHRpbWl6ZSBmIDAuNQ==