The Future of Haskell discussion at the Haskell Workshop

Robert Ennals Robert.Ennals@cl.cam.ac.uk
Wed, 10 Sep 2003 10:26:04 +0100


> Hi!
> 
> > So in summary, here is my proposal:
> > 
> > No specific "extensible records" system.
> > 
> > Define record update to be a function just like record selection is.
> > 
> > Allow these functions to be in type classes.
> 
> I do not understand the second and third point: As I understand your
> idea, record selectors and updaters should still be defined by the
> datatype declaration. What does it then mean that they be "allowed"
> to be defined in type classes? Would that happen automatically?

I was thinking of something along the following lines:


class Wibble a where
    wibble :: a -> Int
    wobble :: a -> String
    set_wibble :: Int -> a -> a
    set_wobble :: String -> a -> a


data Foo = Foo {wibble :: Int, wobble :: String}
	deriving Wibble


The Wibble class defines selector and updater functions for fields called 
wibble and wobble.

When I define the datatype Foo, I give it fields called wibble and wobble, 
which will define the functions in Wibble. If I say "deriving Wibble" then the 
type system acknowledges that these functions are implementing the class 
Wibble. If I had not derived Wibble then there would have been a name clash.


We could imagine the definition of Foo being automatically desugared to the 
following:

data Foo = Foo Int String

instance Wibble Foo where
    wibble (x,_) = x
    wobbble (_,y) = y
    set_wibble x (_,y) = (x,y)
    set_wobble y (x,_) = (x,y)




Note that Wibble is a normal class. I could thus implement Wibble in a class 
that was not a record. For example, the following, rather dull, implementation:

instance Wibble () where
    wibble () = 3
    wobble () = "hello"
    set_wibble _ _ = ()
    set_wobble _ _ = ()


Does that make things clearer?



-Rob