[Haskell-cafe] GHC.Generics: how to derive a Generic instance for an existential type?

José Pedro Magalhães dreixel at gmail.com
Sun Jun 7 07:34:31 UTC 2015


Hi Andreas,

No, GHC.Generics doesn't support existentials.

If your existentials are used as arguments to constructors (like in the
example you've provided), the only approach I'm aware of that might help
you is this:

Alexey Rodriguez Yakushev and Johan Jeuring.
Enumerating Well-Typed Terms Generically.
<http://www.cs.uu.nl/research/techreps/UU-CS-2009-017.html>
In Proceedings workshop on Approaches and Applications of Inductive
Programming 2009.
(This reference seems to be missing its references. You could also look at
Chapter 5 of Alexey's thesis
<file:///C:/Users/Dreixel/Desktop/rodriguez.pdf>.)


If your existentials are used only as indices, then you could look at this:

José Pedro Magalhães and Johan Jeuring.
Generic Programming for Indexed Datatypes.
<http://dreixel.net/research/pdf/gpid.pdf>
In Proceedings of the 7th ACM SIGPLAN Workshop on Generic Programming
(WGP'11), pp. 37–46, ACM, 2011.
(Chapter 10 of my thesis <http://dreixel.net/index.php?content=thesis> has
a more up-to-date version.)



Cheers,
Pedro

On Sat, Jun 6, 2015 at 2:41 PM, Andreas Abel <andreas.abel at ifi.lmu.de>
wrote:

> I wonder whether GHC.Generics supports existential types yet...
>
> {-# LANGUAGE DeriveGeneric #-}
> {-# LANGUAGE ExistentialQuantification #-}
> {-# LANGUAGE StandaloneDeriving #-}
>
> import GHC.Generics
>
> data U = forall a. (Generic a) => U a
>   -- deriving (Generic)
>     -- Can't make a derived instance of ‘Generic U’:
>     --   Constructor ‘U’ has existentials or constraints in its type
>     --   Possible fix: use a standalone deriving declaration instead
>
> -- deriving instance Generic U
>     -- Can't make a derived instance of ‘Generic U’:
>     --   U must be a vanilla data constructor
>     -- In the stand-alone deriving instance for ‘Generic U’
>
> data D1Ser
> data C1_0Ser
>
> instance Generic U where
>   type Rep U = D D1Ser (C1 C1_0Ser (S1 NoSelector (Rep a)))
>     -- Not in scope: type variable ‘a’
>
> -- How to bring the existential type `a' into scope?
>
> --
> Andreas Abel  <><      Du bist der geliebte Mensch.
>
> Department of Computer Science and Engineering
> Chalmers and Gothenburg University, Sweden
>
> andreas.abel at gu.se
> http://www2.tcs.ifi.lmu.de/~abel/
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20150607/d7a05967/attachment-0001.html>


More information about the Haskell-Cafe mailing list