Correct SYB's representation of Char
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
andStringConstr
- Deprecating
mkStringRep
andStringRep
- Introducing
mkCharConstr
andCharConstr
- Introducing
mkCharRep
andCharRep
Additionally, due to deprecation warnings, the following have to change as well:
- libraries/template-haskell/Language/Haskell/TH/Quote.hs
- compiler/utils/Serialized.hs
I'm attaching a patch with the proposed changes. I propose a discussion period of 4 weeks, therefore until the 8th of January.
Trac metadata
Trac field | Value |
---|---|
Version | 6.10.1 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | libraries/base |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |