monarch_dodra:

I'm taking this naming-changing event as an opportunity to "cleanup" reduce too. One thing that gets on my nerves is that "range.reduce()" is not nothrow, because it throws an exception if the range is empty.

I think this is wrong. popping an empty range is an *Error*, and should be validated by the programmer. Because of this, it is currently not possible to use "reduce(range)" in nothrow context.

This Haskell library shows one way Haskellers use to face similar problems:
http://hackage.haskell.org/package/safe-0.3.4/docs/Safe.html

Every function that could have similar problems is present in four forms, with the "Note", "Def", "May" and "Safe" suffixes.

An example with the standard Haskell function "tail", that is similar to dropOne of std.range (skips the first and returns the rest. The problem is when the input list is empty):

tailDef :: [a] -> [a] -> [a]
 tailDef [12] [] = [12]
 tailDef [12] [1,3,4] = [3,4]

tailMay :: [a] -> Maybe [a]
 tailMay [] = Nothing
 tailMay [1,3,4] = Just [3,4]

tailNote :: String -> [a] -> [a]
tail "help me" [] = error "Pattern match failure, tail [], help me"
 tail "help me" [1,3,4] = [3,4]

tailSafe :: [a] -> [a]
 tailSafe [] = []
 tailSafe [1,3,4] = [3,4]

Bye,
bearophile

Reply via email to