Чтобы понять функцию fix
из Control.Monad.State
, fix :: (a -> a) -> a
, у меня есть этот небольшой код в modifyValue
, который увеличивает целое число до 49, тогда функция всегда возвращает 50.
import Control.Monad.State
type StateVal = Int
modifyValue :: StateVal -> StateVal
modifyValue v | v < 50 = v + 1
modifyValue v = 50
simpleStateStep :: State StateVal ()
simpleStateStep = do
s <- get
put $ modifyValue s
main = do
putStrLn $ show $ fix modifyValue
Однако, когда я запускаю этот код, вместо того, чтобы найти точку фиксации на 50, где последовательность сходится к 50 ... он утверждает *** Exception: <<loop>>
Понятно, что я что-то ошибаюсь, поскольку я не указываю начальное состояние для запуска последовательности, например, с 1, которое могло бы сгенерировать [2,3,4,..,49,50,50,50,50....]
Я неправильно использую функцию исправления? Есть что-то сделать, чтобы он нашел точку фиксации 50?
fix
возвращает наименее определенную фиксированную точку функции.50
является фиксированной точкой, ноundefined
- тоже:modifyValue undefined
даетundefined
. И посколькуundefined
менее определен, чем50
, возвращается именно это.fix
полезен только для функций, не имеющихundefined
в качестве фиксированной точки. - person melpomene   schedule 15.07.2019