String != [Char]

Ian Lynagh igloo at
Sat Mar 24 23:27:44 CET 2012

On Sat, Mar 24, 2012 at 05:31:48PM -0400, Brandon Allbery wrote:
> On Sat, Mar 24, 2012 at 16:16, Ian Lynagh <igloo at> wrote:
> > On Sat, Mar 24, 2012 at 11:50:10AM -0700, Johan Tibell wrote:
> > > Using list-based operations on Strings are almost always wrong
> >
> > Data.Text seems to think that many of them are worth reimplementing for
> > Text. It looks like someone's systematically gone through Data.List.
> > And in fact, very few functions there /don't/ look like they are
> > directly equivalent to list functions.
> >
> I was under the impression they have been very carefully designed to do the
> right thing with characters represented by multiple codepoints, which is
> something the String version *cannot* do.  It would help if Bryan were
> involved with this discussion, though.  (I'm cc:ing him on this.)  Since
> the whole point of Data.Text is to handle stuff like this properly I would
> be surprised if your assertion that
> >     upcase :: String -> String
> > >     upcase = map toUpper
> >
> > This is no more incorrect than
> >    upcase = toUpper
> is correct.

I don't see how it could do any better, given both use
    toUpper :: Char -> Char
to do the hard work. That's why there is also a
    Data.Text.toUpper :: Text -> Text

Based on a very quick skim I think that there are only 3 such functions
in Data.Text (toCaseFold, toLower, toUpper), although the 3
justification functions may handle double-width characters properly.

Anyway, my main point is that I don't think that either text or String
should make it any easier for people to get things right. It's true that
currently only text makes correct case-conversions easy, but only
because no-one's written* yet.


More information about the Haskell-prime mailing list