filepath

Simon Marlow simonmarhaskell at gmail.com
Wed Dec 12 04:23:27 EST 2007


Ian Lynagh wrote:
> On Tue, Dec 11, 2007 at 02:22:14PM +0000, Simon Marlow wrote:
>> Ian Lynagh wrote:
>>> The two answers above together mean that the property
>>>
>>>    \x y -> let x' = normalise x
>>>                y' = normalise y
>>>                z = x' </> y'
>>>            in z == normalise z'
>>>
>>> doesn't hold (for x = ".", y = "foo"), but it is one I would expect to
>>> hold.
>> I think you have an extra ' on the last line of the code above.
> 
> Yes, thanks.
> 
>> But anyway, why do you expect that to hold?
> 
> It just seems obvious to me that operators on a datatype would maintain
> normalisedness of that type. If it's not obvious to you then I'm not
> sure I can explain why; it's like explaining to someone why you find
> something beautiful.

The only reason *not* to make "." </> p == p is that in some contexts (e.g. 
rawSystem) "foo" is not the same as "./foo".

You could argue that rawSystem is therefore not taking a proper FilePath as 
an argument, it is taking something else, and we should be more explicit 
about it,

  data ExecutableSpec = FindOnPath String | Relative FilePath

this certainly has some merit.

However, if we don't change the API of rawSystem, then having "." </> p == 
p would make it somewhat harder to construct the argument to rawSystem, you 
would have to do it manually: "." ++ pathSeparator : "foo".

I guess that seems reasonable, given that rawSystem is really the exception.

Cheers,
	Simon


More information about the Libraries mailing list