Skip to content

Generic for existential types

I have some use for Generic for an existential type which is constraint to be Generic.

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE StandaloneDeriving #-}

import GHC.Generics

data U = forall a. (Generic a) => U a
  deriving (Generic)  -- TRY 1
    -- 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 -- TRY 2
    -- 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 -- TRY 3
  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?
Edited by andreas.abel
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information