[Haskell-cafe] Fun with ByteStrings [was: A very edgy language]

Stefan O'Rear stefanor at cox.net
Sun Jul 8 10:58:32 EDT 2007


On Sun, Jul 08, 2007 at 04:38:19PM +0200, Malte Milatz wrote:
> Tillmann Rendel:
> > As I understand it (wich may or may not be correct):
> > 
> > A normal Haskell string is basically  [Word8]
> 
> Hm, let's see whether I understand it better or worse.  Actually it is
> [Char], and Char is a Unicode code point in the range 0..1114111 (at
> least in GHC).  Compare:
> 
> 	Prelude Data.Word> fromEnum (maxBound :: Char)
> 	1114111
> 	Prelude Data.Word> fromEnum (maxBound :: Word8)
> 	255
> 
> So it seems that the Char type abstracts the encoding away.  I'm
> actually a little confused by this, because I haven't found any means to
> make the I/O functions of the Prelude (getContents etc.) encoding-aware:
> The string "ä", when read from a UTF-8-encoded file via readFile, has a
> length of 2.  Anyone with a URI to enlighten me?

Not sure of any URIs.

Char is just a code point.  It's a 32 bit integer (64 on 64-bit
platforms due to infelicities in the GHC backend) with a code point.  It
is not bytes.  A Char in the heap also has a tag-pointer, bringing the
total to 8 (16) bytes.  (However, GHC uses shared Char objects for
Latin-1 characters, so a "fresh" Char in that range uses 0 bytes).

[a] is polymorphic.  It is a linked list, it consumes 12 (24) bytes per
element.  It just stores pointers to its elements, and has no hope of
packing anything.

[Char] is a linked list of pointers to heap-allocated fullword integers,
20 (40) bytes per character (assuming non-latin1).

The GHC IO functions truncate down to 8 bits.  There is no way in GHC to
read or write full UTF-8, short of doing the encoding yourself (google
for UTF8.lhs).

Stefan


More information about the Haskell-Cafe mailing list