[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