[Haskell-cafe] Automatically generate sum type members -> [String]

Tikhon Jelvis tikhon at jelv.is
Mon May 18 23:29:48 UTC 2015

You can get this information through the Data.Data module. There are two
typeclasses which can be (have to be, I believe) derived for your data
type, Data and Typeable. The Data class lets you access a representation of
your type including type constructors.

To set this up, you need to import Data.Data and enable the
DeriveDataTypeable extension:

    {-# LANGUAGE DeriveDataTypeable #-}
    import Data.Data

    data Codes = A0100A | A0500A deriving (Show, Data, Typeable)

Now you can get a representation of the type:

    λ> dataTypeOf (undefined :: Codes)
    DataType {tycon = "Main.Codes", datarep = AlgRep [A0100A,A0500A]}

Since your type is an algebraic data type (AlgRep), the DataRep contains
its constructors, which you can inspect with functions from the Data.Data

On Mon, May 18, 2015 at 4:20 PM, Cody Goodman <codygman.consulting at gmail.com
> wrote:

> Can I use either template Haskell, GHC Generics, or something else to
> get the list of Constructors in Codes? Then I could do `map show
> codeSumTypeMembers` and get `["A0100A","A0500A"]`?
> Here's an example of solving this problem manually:
> data Codes = A0100A | A0500A deriving Show
> codeExists "A0100A" = True
> codeExists "A0500A" = True
> codeExists _ = False
> main = print $ codeExists xmlElementName
>        where xmlElementName = "A0500A"
> -- λ> main
> -- True
> _______________________________________________
> 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/20150518/78a21319/attachment.html>

More information about the Haskell-Cafe mailing list