[Haskell-cafe] File path programme

robert dockins robdockins at fastmail.fm
Thu Jan 27 13:36:49 EST 2005


>  - Keep the existing System.IO API the same. openFile, createDirectory
> ... will take the file path as string.

The problem is that "string" means different things in haskell and in C.
A C "string" is really just a contiguous sequence of octets in memory. 
A haskell string has a particular interpretation, that of a list of 
unicode characters.  Depending on how strings come into and leave the 
haskell world, there may OR MAY NOT be a one-to-one mapping between C 
strings and haskell strings, if non-trivial character encodings are 
involved (they will be eventually).  Decoding may fail (no haskell 
representation for that string), or it might be that (deocde . encode) 
/= id, which is also bad (file name returned from a directory listing 
gives file not found error).  The sad truth is that FilePath = String is 
BROKEN.  FilePath = [Word8] would at least preserve filenames as they 
move across the boundaries of the haskell world, but then simple 
questions like "does this file have a .gz ending" become difficult 
(because they depend on the encoding).  We need something else.  Maybe 
ADTs aren't it, but String certainly isn't.  I don't think "mostly 
works, if you only use ASCII" is good enough for something as basic as 
file IO.

>  In most cases we do only simple manipulations on path 

Even simple manipulations break in the presence of encoding issues, or 
even just of unusual paths.  What is the extension of "\\.\TAPE0" ?  Its 
not "\TAPE0".  BTW this is a valid path on Windows 2000 upwards.  If you 
don't care about corner cases, then you have no worries.  It would be 
nice to have correct handling for all valid paths on each supported OS 
though.



More information about the Haskell-Cafe mailing list