(Это лучше подходит как комментарий к ответу Heatsink, но это слишком долго.)
MonadFix
экземпляры должны придерживаться нескольких законов . Одним из них является сокращение / уменьшение влево :
mfix (\x -> a >>= \y -> f x y) = a >>= \y -> mfix (\x -> f x y)
Этот закон позволяет переписать ваше выражение как
mfix (\xs -> uniform >>= \x -> return (x:xs))
= uniform >>= \x -> mfix (\xs -> return (x:xs))
= uniform >>= \x -> mfix (return . (x :))
Используя другой закон, чистота mfix (return . h) = return (fix h)
, мы можем еще больше упростить до
= uniform >>= \x -> return (fix (x :))
и используя стандартные законы монады и переписав fix (x :)
как repeat x
= liftM (\x -> fix (x :)) uniform
= liftM repeat uniform
Следовательно, результатом действительно является один вызов uniform
и последующее повторение одного значения бесконечно.