[Hs-Generics] Re: Proposal #2875: Correct SYB's representation of Char

José Pedro Magalhães jpm at cs.uu.nl
Fri Jan 16 08:43:31 EST 2009


Hello all,

On Thu, Dec 11, 2008 at 16:06, José Pedro Magalhães <jpm at cs.uu.nl> wrote:

> Hello all,
>
> SYB uses DataRep to represent datatypes:
>
>     -- | Public representation of datatypes
>     data DataRep = AlgRep [Constr]
>                  | IntRep
>                  | FloatRep
>                  | StringRep
>                  | NoRep
>
> I believe that StringRep should be CharRep. Note that IntRep is used for
> the primitive 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
>
> I find this behavior counterintuitive. Therefore I propose to rename
> StringRep to CharRep and mkStringConstr to mkCharConstr. For backwards
> compatibility, this entails:
>
>     * Deprecating mkStringConstr and StringConstr
>     * Deprecating mkStringRep and StringRep
>     * Introducing mkCharConstr and CharConstr
>     * Introducing mkCharRep and CharRep
>
> Additionally, due to deprecation warnings, the following have to change as
> well:
>
>     * libraries/template-haskell/Language/Haskell/TH/Quote.hs
>     * compiler/utils/Serialized.hs
>
> A patch is attached in #2875 (
> http://hackage.haskell.org/trac/ghc/ticket/2875). I propose a discussion
> period of 4 weeks, therefore until the 8th of January.


The discussion period is now over. According to the feedback from Neil, I
will submit new patches where 'StringRep' disappears completely instead of
being deprecated. The function 'mkStringRep', however, will be kept as
deprecated (and will now use the new CharRep).


Thanks,
Pedro
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/generics/attachments/20090116/d16628c6/attachment.htm


More information about the Generics mailing list