Henning Thielemann wrote:

On Thu, 8 May 2008, Madoc wrote:

minValue = 0::Int
maxValue = 1000::Int

normalize a | a < minValue = minValue
           | a > maxValue = maxValue
           | otherwise = a


normalize' = min maxValue . max minValue

There is a curiosity here. The functions normalize and normalize' are extensionally equal only because minValue <= maxValue, but intensionally different. The intensional equivalent is to reverse order of composition:

normalize'' = max minValue . min maxValue

which remains equal to to normalize whatever the values of minValue and maxValue.

That the order of composition (or of guarded expressions) matters conditionally base on its parameters is reason enough for the original poster to decide what the "right answer" should be if maxValue < minValue. These corner cases are often where future bugs lie dormant. My choice would be:

normalize'''    = max trueMin . min trueMax
  where trueMin = min minValue maxValue
        trueMax = max minValue maxValue

Now the function makes no assumptions about external values. This is no less efficient than before, since trueMin and trueMax are CAFs evaluated only once.


_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to