Changes to Typeable

Simon Marlow marlowsd at gmail.com
Mon Oct 8 13:27:28 CEST 2012


On 04/10/2012 10:44, Simon Peyton-Jones wrote:

> I'm beginning to regret mentioning optimisation -- it's purely an
> implementation matter.  Yes the same dictionaries get constructed,
> the runtime behaviour is unchanged. The difference is that when GHC
> asks "Is type constructor T an instance of Typeable" it would know
> that the answer is "yes, and the dictionary is called $dfTypeableT".
> That's all. Its saves the lookup, and more important, saves the very
> existence of the table.
>
> I think it would be better to focus the discussion on the question of
> whether you would ever NOT want a type constructor to be an instance
> of Typeable

Code size?  It might only be a small effect for most code, but we 
occasionally see large files of automatically-generated data declarations.

Also I rather like it that making a new data type is so cheap in terms 
of code size.  A single module containing "data T = A | B":

$ size foo.o
    text    data     bss     dec     hex filename
      91      32       0     123      7b foo.o

If I add "deriving Typeable":

    text    data     bss     dec     hex filename
     587     312       0     899     383 foo.o

7x larger!

Cheers,
	Simon





>
> S
>
> | -----Original Message-----
> | From: libraries-bounces at haskell.org [mailto:libraries-
> | bounces at haskell.org] On Behalf Of Andres Löh
> | Sent: 04 October 2012 10:30
> | To: Simon Peyton-Jones
> | Cc: libraries at haskell.org
> | Subject: Re: Changes to Typeable
> |
> | > So back to the Plan A vs Plan B discussion.
> |
> | I'm sorry, I don't completely understand why Plan A is an
> | "optimization". As far as I know, the typechecker doesn't merely have
> | the task of answering the question "does Typeable X" hold, but rather it
> | has to come up with evidence that "Typeable X" holds. I fail to see how
> | even the knowledge that every concrete datatype is in principle Typeable
> | makes it any easier to come up with the type representation that's
> | required during run-time.
> |
> | For example, if you consider
> |
> | data AnyTypeable = forall a. (Typeable a) => AnyTypeable a
> |
> | and you unpack and use such a value in a function, then clearly the only
> | place to get the type representation from is the constructor itself, and
> | similarly,
> |
> | data Any = forall a. Any a
> |
> | should really not have any type representation available at runtime at
> | all.
> |
> | Similarly, for less extreme cases, we'd still need dictionary
> | transformers and plug together type representations from different
> | components. So why can we get rid of the instance table? What am I
> | missing?
> |
> | Cheers,
> |   Andres
> |
> | --
> | Andres Löh, Haskell Consultant
> | Well-Typed LLP, http://www.well-typed.com
> |
> | _______________________________________________
> | Libraries mailing list
> | Libraries at haskell.org
> | http://www.haskell.org/mailman/listinfo/libraries
>
>
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://www.haskell.org/mailman/listinfo/libraries
>




More information about the Libraries mailing list