
Hello Gracjan, Tuesday, June 07, 2005, 2:25:50 PM, you wrote: class Monad m =>> Ref m r | m -> r where GP> newRef :: a -> m (r a) GP> readRef :: r a -> m a GP> writeRef :: r a -> a -> m () may be the following will be even more interesting: import Control.Monad import Data.IORef infixl 0 =:, +=, -=, =::, <<= ref = newIORef val = readIORef a=:b = writeIORef a b a+=b = modifyIORef a (\a-> a+b) a-=b = modifyIORef a (\a-> a-b) a=::b = ((a=:).b) =<< val a for :: [a] -> (a -> IO b) -> IO () for = flip mapM_ newList = ref [] list <<= x = list =:: (++[x]) push list x = list =:: (x:) pop list = do x:xs<-val list; list=:xs; return x main = do sum <- ref 0 lasti <- ref undefined for [1..5] $ \i -> do sum += i lasti =: i sum =:: (\sum-> 2*sum+1) print =<< val sum print =<< val lasti xs <- newList for [1..3] (push xs) xs <<= 10 xs <<= 20 print =<< val xs I use this module to simplify working with references in my program. The first inteface can be used for IORef/STRef/MVar/TVar and second for lists and Chan -- Best regards, Bulat mailto:bulatz@HotPOP.com