Rewrite of Data.Char library?
igloo at earth.li
Sun Oct 25 15:04:03 EDT 2009
On Thu, Oct 22, 2009 at 07:56:56PM -0700, Ahn, Ki Yung wrote:
> Ahn, Ki Yung 쓴 글:
> > In the #haskell IRC channel, we just had a discussion on Data.Char
> > predicates such as isAlpha, isUpper, isLower. The implementation of
> > Data.Char is not Haskell 98 since Char specification in Haskell 98 only
> > covers latin1.
Char in Haskell98 covers Unicode too;
Function toUpper converts a letter to the corresponding upper-case
letter, leaving any other character unchanged. Any Unicode letter
which has an upper-case equivalent is transformed. Similarly,
toLower converts a letter to the corresponding lower-case letter,
leaving any other character unchanged.
> > However, current predicates are confusing and intuitive
> > properties does not hold. One example is this:
> > [17:53:32] <newsham> > let cs = [minBound..maxBound]; us = filter
> > isUpper cs; ls = filter isLower cs in take 5 $ (map toUpper ls) \\ us
> > [17:53:33] <lambdabot> "\170\186\223I\312"
> > isLower '\170' == True but you can't turn that into an uppercase
> > letter. isUpper '170' == '\170'.
What behaviour would you expect?
> Another problem is that, in the Haskell 98 Report, isAlpha is defined as
> isLower or isUpper. This is different from the current implementation.
> What isAlhpa is categorizing is all the "Letter" categories.
Right, we have:
isLower = "Letter, Lowercase"
isUpper = "Letter, Uppercase" or "Letter, Titlecase"
isAlpha = "Letter, Lowercase" or
"Letter, Uppercase" or "Letter, Titlecase" or
"Letter, Modifier" or "Letter, Other"
The report says:
any alphabetic character which is not lower case is treated as upper
case (Unicode actually has three cases: upper, lower, and title"
isAlpha c = isUpper c || isLower c
so the implementation is not consistent with the language definition. I
wouldn't like to say which is "wrong", though (but I would guess "both"
:-) I think it would be great if someone were to design a new interface
that provided something closer to the Unicode spec, perhaps in
Data.Char.Unicode; we could make the current interface a layer on top).
> So, wouldn't it be better to keep isAlpha to follow the definition of
> the Haskell 98 report, and just define a new predicate called isLetter
> if needed?
If your idea is to improve the handling of '\170' then this won't help.
'\170' is "Letter, Lowercase".
More information about the Libraries