Splitting SYB from the base package in GHC 6.10

Ross Paterson ross at soi.city.ac.uk
Mon Sep 1 10:43:00 EDT 2008


On Mon, Sep 01, 2008 at 02:49:01PM +0200, José Pedro Magalhães wrote:
> Then it was also suggested that Data.Generics.Instances [3] could stay in base
> (perhaps inside Basics as well). This, however, would prevent dealing with the
> "dubious" Data instances [4], and this was one of the motivating factors to
> split SYB from base. This refers concretely to the instances:
> 
>     instance (Data a, Data b) => Data (a -> b)
>     instance Typeable a => Data (IO a)
>     instance Typeable a => Data (Ptr a)
>     instance Typeable a => Data (StablePtr a)
>     instance Typeable a => Data (IORef a)
>     instance Typeable a => Data (ForeignPtr a)
>     instance (Typeable s, Typeable a) => Data (ST s a)
>     instance Typeable a => Data (TVar a)
>     instance Typeable a => Data (MVar a)
>     instance Typeable a => Data (STM a)
>     instance (Data a, Integral a) => Data (Ratio a)
> 
> These instances are defined in such a way that they do not traverse the
> datatype. In fact, there is no other possible implementation, and this
> implementation at least allows for datatypes which contain both "regular" and
> "dubious" elements to still have their "regular" elements traversed.
> However, this implies that a user cannot redefine such instances even in the
> case where s/he knows extra information about these types that would allow for
> a more useful instance definition, for instance.

These two statements appear to be contradictory.  Perhaps an example of
a possible instance would help.

In any case, it seems there's no objection to placing the following
instances together with the Data class:

  () Bool Char Double Float Handle Ordering
  Int Int8 Int16 Int32 Int64 Integer Word Word8 Word16 Word32 Word64
  DataType TyCon TypeRep
  [] Maybe Either tuples

Claus also mentioned the Ptr/Var types, which also don't seem to have a
value that can be traversed.

I think the Ratio instance really ought to be in base, as Rational is in
the Prelude.  What about Complex?

Claus argued that -> and the monads could be treated by analogy with
Show for these types.

There is an additional problem with types like ThreadId, Array, ST, STM,
TVar and MVar: they're notionally defined in other packages, even though
they're actually defined in partially-hidden GHC.* modules in base and
re-exported.


More information about the Libraries mailing list