>>857
モナディックになってしまうが、MArray のインスタンスを使うのはどうだろう?

import Data.Array.IO
import Control.Monad

fix :: (Eq a, Monad m) => (a -> m a) -> a -> m a
fix f x = do
{ y <- f x
; if x == y then return x else fix f y
}

f' :: Monad m => (a -> m Bool) -> (a -> m a) -> a -> m a
f' p k x = do
{ b <- p x
; if b then return x else k x
}

f = f' (getBounds >=> return . (0==) . fst) (\a -> writeArray a 0 100 >> return a)

main = do
{ x <- newListArray (0, 10) [0..] :: IO (IOArray Int Int)
; y <- fix f x
; assoc <- getAssocs y
; print assoc
}

つづく