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)
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
If you don't want to use Typeable
, you can also do this with Show
.
getDConst :: D -> String
getDConst = head . words . show
Show
will not output all the fields, because it is lazy. You can test it runing this code in ghci
:
Prelude> data D = D [Int] deriving (Show)
Prelude> getDConst $ D [1..]
"D"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With