Where prelude alternatives/ classes and types to get values?

Marc Weber marco-oweber at gmx.de
Sat Feb 17 11:48:15 EST 2007


The prelude has some issues such like 
Map.empty,
Sequnce.empty,
Set.empty

It would be much nicer to use
class Empty where
empty :: a
except of more complicated error messages (especially for newbies)

Are there already some proposals?
Is this the right place to discuss these topics?
I got this idea because I'm currently learning more about webfunctions.
Some states (eg counters) are implemented using IORefs.

I could imagine a class

class ModifyIO m c where
modify :: IORef a -> ( a -> a ) -> m c

data Old a
data New a
data OldNew a = OldNew a a;

modify f = do a <- readIORef io
	   let new = f a
	   writeIORef io new
	   return $ f old new

instance ModifyIO IO (Old a) =
modify io f = modify io (\old _ -> Old old)
instance ModifyIO IO (New a) =
modify io f = modify io (\_ new -> New new)
instance ModifyIO IO (OldNew a) =
modify io f = modify io OldNew

which would lead to code such as

... = do (New count) <- modify ioCounterRef (+1)
 ...

compared to
... = do count <- readIORef ioCounterRef
 let count = count + 1
 writeIORef ioCounterRef count
 ...

Do you think this style is insane?

Marc Weber


More information about the Libraries mailing list