[Haskell-cafe] Read instance for constructors?

Niklas Haas haskell at nand.wakku.to
Wed Mar 12 00:10:19 UTC 2014


On Tue, 11 Mar 2014 19:41:57 +0000, Semen Trygubenko / Семен Тригубенко <semen at trygub.com> wrote:
> On Tue, Mar 11, 2014 at 01:21:01PM +0100, Niklas Haas wrote:
> > The idiomatic way to handle this kind of stuff normally is to pass an
> > abstract proxy that carries the type as a type argument, rather than
> > passing a value of that type itself, eg.:
> > 
> > > data Proxy a = Proxy
> > >
> > > dataTypeOf :: Data a => Proxy a -> DataTypeOf
> > 
> > or even a more polymorphic version:
> > 
> > > dataTypeOf :: Data a => f a -> DataTypeOf
> 
> Thank you for your reply — I've read it many times, but couldn't translate it into code
> as of yet.
> 
> I don't mind ugly as long as it's safe.
> Specifically, how am I to construct an entity of type DataType (see Data.Data; DataType needs to be fed
> into readConstr) with the help of a wrapper function you are describing?
> 
> If someone could in the direction of a skeleton for
> such a function I might be able to fill in the gaps on my own.
> But currently I'm stuck… :/
> 
> Thanks again,
> S.

Oops, sorry, that was supposed to have been:

> dataTypeOf :: Data a => Proxy a -> DataType
or
> dataTypeOf :: Data a => p a -> DataType

As for the implementation, the simplest possible (ie. no language
extensions) implementation I can think of looks like this:

> dataTypeOf = Data.dataTypeOf . f
>   where f :: p a -> a
>         f _ = error "dataTypeOf: this should never be used"

where Data.dataTypeOf refers to the ‘original’ version of that function.


More information about the Haskell-Cafe mailing list