Haskell: Get data constructor name as string

deriving, generic-programming, ghc, haskell, reflection

Solution

Found the solution myself, but leaving this question to help others:

import Data.Data
data D = X Int | Y Int Int deriving (Data,Typeable)

let result = show $ toConstr (X 3) -- result contains what we wanted

Problem

Let us say we have ``` data D = X Int | Y Int Int | Z String ``` I wish to have a function `getDConst` ``` getDConst :: D -> String ``` that returns either "X", "Y", or "Z", according to the data constructor used for its input. Is there a generic way to write this without having to do `case` on every data constructor? (I am ok with solutions relying on `Data.Typeable` or something similar)

Original source

Related problems