
Hi Neil,
On 7/17/06, Neil Mitchell
Hi Brian,
You sent this email just to me, and not to the list. If you indended to send to the list then feel free to forward my bits on to the list.
I know that FilePath is defined by Haskell '98 as a String and so it cannot be changed. So, perhaps a new type or class should be created for this library (hereafter "GoodPath," although I am not suggesting that is the best name). The problem is people will have to marshal their data into this GoodPath, and marshal it out again. When people can shortcut that marshalling, as the current readFile/writeFile definitions ensure they can, they will. At that point you loose all safety because people will abuse it.
I disagree. It would be trivial to create a new module that exported new definitions of file IO actions that operated on "GoodPath" instead of "FilePath," transparently delegating to the original readFile/writeFile/etc. until they could be removed in the future. This would also support the "SuperFilePath" idea you mentioned. Another thing I thought of would be a "canonicalPath" IO action (canonicalPath :: FilePath -> IO FilePath) that returns a FilePath that implements case-preserving-case-insensitive matching. For example, if there is a file named "Hello There.txt" in C:\, then (canonicalPath "c:\hello there.txt ") would give "C:\Hello There.txt"). I think that the xxxDrive functions should only be exported from System.FilePath.Windows and no System.FilePath since it is unclear as to how they should be used effectively by cross-platform software. - Brian