[Hs-Generics] SYB's StringRep behavior

José Pedro Magalhães jpm at cs.uu.nl
Mon Dec 8 07:33:23 EST 2008


Hello,

SYB uses DataRep to represent datatypes:

-- | Public representation of datatypes
> data DataRep = AlgRep [Constr]
>              | IntRep
>              | FloatRep
>              | StringRep
>              | NoRep
>

Am I right to believe that StringRep should be CharRep? Note that IntRep is
used for the primitives Int and Integer datatypes, FloatRep for Float and
Double, and StringRep (apparently) for Char. String, however, is represented
as 'AlgRep [[],(:)]':

*Main> dataTypeOf 'p'
> DataType {tycon = "Prelude.Char", datarep = StringRep}
> *Main> dataTypeOf "p"
> DataType {tycon = "Prelude.[]", datarep = AlgRep [[],(:)]}


This makes sense, since String is not a primitive datatype. But it causes
the apparently wrong behavior:


> *Main> fromConstr (mkStringConstr (dataTypeOf "a") "ab") :: String
> "*** Exception: mkStringConstr
> *Main> fromConstr (mkStringConstr (dataTypeOf 'a') "ab") :: String
> "*** Exception: constrIndex


The correct way of using mkStringConstr is to construct a Char. This,
however, only works for strings with a single character:

*Main> fromConstr (mkStringConstr (dataTypeOf 'a') "b")  :: Char
> 'b'
> *Main> fromConstr (mkStringConstr (dataTypeOf 'a') "ab") :: Char
> *** Exception: gunfold
> *Main> fromConstr (mkStringConstr (dataTypeOf 'a') "")   :: Char
> *** Exception: gunfold
>


Wouldn't it be more clear if StringRep would be named CharRep and
mkStringConstr named mkCharConstr?


Thanks,
Pedro
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/generics/attachments/20081208/4f02fb65/attachment-0001.htm


More information about the Generics mailing list