proposal: in base, for Data.Version, change the meaning of comparisons

Simon Marlow simonmarhaskell at gmail.com
Fri Oct 26 04:18:09 EDT 2007


Malcolm Wallace wrote:
> Proposal: that values of the type Data.Version.Version should compare
> equal, by ignoring trailing zeros.
> Thus 1.2.0 == 1.2, rather than 1.2.0 > 1.2

I see advantages and disadvantages.

Advantages:

  * matches intuitive understanding of versions
  * lets us drop trailing zeroes in version numbers

Disadvantages:

  * version ordering is slightly harder to explain

Is there a precedent anywhere else for doing this?

> [In Data.Version, make equality comparisons independent of trailing zeros.
> Malcolm.Wallace at cs.york.ac.uk**20071025161240] {
> hunk ./Data/Version.hs 122
> -  v1 == v2  =  versionBranch v1 == versionBranch v2 
> +  v1 == v2  =  branchEq (versionBranch v1) (versionBranch v2)
> hunk ./Data/Version.hs 125
> +  where
> +    branchEq :: [Int] -> [Int] -> Bool
> +    branchEq [] [] = True
> +    branchEq vs [] = all (==0) vs
> +    branchEq [] vs = all (==0) vs
> +    branchEq (v:vs) (w:ws) = v==w && branchEq vs ws
> hunk ./Data/Version.hs 133
> -  v1 `compare` v2 = versionBranch v1 `compare` versionBranch v2
> -
> +  v1 `compare` v2 = versionBranch v1 `cmpBranch` versionBranch v2
> +  where
> +    cmpBranch [] [] = EQ
> +    cmpBranch vs [] | all (==0) vs = EQ
> +                    | otherwise    = GT
> +    cmpBranch [] vs | all (==0) vs = EQ
> +                    | otherwise    = LT
> +    cmpBranch (v:vs) (w:ws) | v==w = cmpBranch vs ws
> +                            | otherwise = compare v w
> +
> }

Wouldn't the implementation be simpler if you added a dropTrailingZeros 
function, and just applied it before comparing?  That would more obviously 
match the informal description too.

Cheers,
	Simon



More information about the Libraries mailing list