On Mon, Mar 1, 2010 at 09:40, Leon Smith
wrote:
On Mon, Mar 1, 2010 at 2:39 AM, Sean Leather wrote:
> It seems more intuitive to reverse the naming. The key parameter to
> lookupFloor is actually the ceiling, and the key returned is the greatest
> key less than or equal to the ceiling. Since there is no floor involved
> here, I would call the function lookupCeiling.
The greatest number less than something would be the floor. :-)
So, what I didn't say (but was thinking) was that I would find these renamings more intuitive:
lookupFloor --> lookupWithCeiling
lookupCeiling --> lookupWithFloor
These tell me that the key is the ceiling or floor value.
For example:
ghci> let map = Map.fromList [ (x, ()) | x <- [0,10..1000] ]
ghci> lookupFloor 75 map
Just (70, ())
ghci> floor 7.5
7
ghci> lookupCeiling 115 map
Just (120,())
ghci> ceiling 11.5
12
I understand where you're coming from. You're mapping the set of keys to the set of integers and applying the (e.g.) floor function to the key within that set. Alternative (though verbose) names for your functions might be:
lookupFloor --> applyFloorAndLookup
lookupCeiling --> applyCeilingAndLookup
In contrast, I looked at the parameter as being the lower or upper bound. So, perhaps an even better naming (from my point of view) would be:
lookupFloor --> lookupWithUpperBound or lookupUpperBound or lookupUB or ...
lookupCeiling --> lookupWithLowerBound or lookupLowerBound or lookupLB or ...
Something like this might also remove any confusion about floor and ceiling.
But honestly I almost invariably get the definitions of floor and
ceiling wrong unless I stop to think for a few seconds. I've trained
myself to do that. ;-)
With your current naming scheme, I think I would constantly choose the opposite function. But maybe that's just me.
Maybe a few examples in the haddocks would
be in order. That's easier to comprehend, if you know approximately
what it should do.
Whatever is the end result, I think you should definitely have some examples in the documentation.
Also, it occurs to me that maybe a combined function :: (Ord k) => k
-> Map k v -> (Maybe k v, Maybe k v) would be useful in addition to
or in place of lookupFloor and lookupCeiling. But I'm not sure.