[Haskell] Mixing monadic and non-monadic functions

robert dockins robdockins at fastmail.fm
Thu Sep 15 16:25:37 EDT 2005


I raise you:

class (Monad m) => Ref m c | c -> m
   where new  :: a -> m (c a)
         get  :: c a -> m a
         peek :: c a -> m a
         set  :: c a -> a -> m ()
         modify   :: c a -> (a -> a) -> m a
         modify_  :: c a -> (a -> a) -> m ()
         modifyM  :: c a -> (a -> m a) -> m a
         modifyM_ :: c a -> (a -> m a) -> m ()



Bulat Ziganshin wrote:

> Hello Lyle,
> 
> Thursday, September 15, 2005, 10:50:30 PM, you wrote:
> 
> 
>>>  z := *x + *y   -- translated to { x' <- readIORef x; y' <- readIORef y; writeIORef z (x'+y') }
>>>
> 
> LK> Right, I realize my suggestion is the same as Ben's.  I just prefer a 
> LK> more succinct notation, like special brackets instead of a keyword.  I 
> LK> like your idea about IORefs.  I think it should work as well for 
> LK> STRefs... perhaps it needs to belong to a type class, in a way?
> 
> of course
> 
> class Ref c a where
>   new :: a -> IO (c a)
>   get :: c a -> IO a
>   set :: c a -> a -> IO ()
> 
> 
> 



More information about the Haskell mailing list