Regarding defining cases exhaustively

Hi all, I have this code myMaximumBy :: (a -> a -> Ordering) -> [a] -> a myMaximumBy _ [] = undefined myMaximumBy _ (x:[]) = x myMaximumBy f (x:xs) = case f x maxRestOfList of GT -> x _ -> maxRestOfList where maxRestOfList = myMaximumBy f xs whereby the case myMaximumBy _ [] will never happen because case myMaximumBy _ (x:[]) = x prevents that from happening. However i will still like to define it to keep -Wall warning from complaining. Is using undefined acceptable or is there a better way? -- Best Regards, Boon Hui

On 2016-10-10 07:15, Lai Boon Hui wrote:
I have this code
myMaximumBy :: (a -> a -> Ordering) -> [a] -> a myMaximumBy _ [] = undefined myMaximumBy _ (x:[]) = x myMaximumBy f (x:xs) = case f x maxRestOfList of GT -> x _ -> maxRestOfList where maxRestOfList = myMaximumBy f xs
whereby the case myMaximumBy _ [] will never happen because case myMaximumBy _ (x:[]) = x prevents that from happening.
Somebody could call 'myMaximumBy' with an empty list, so as far as the compiler (and fellow programmers) are concerned, this case can certainly happen.
However i will still like to define it to keep -Wall warning from complaining.
Is using undefined acceptable or is there a better way?
If you're fine with having a partial function (i.e. which is not defined for all possible inputs), then 'undefined' is okay. An alternative might be myMaximumBy _ [] = error "empty list" A nicer approach might be to make 'myMaximumBy' a total function though, i.e. give a plausible definition even for empty lists. So, for instance, you could declare it as myMaximumBy :: (a -> a -> Ordering) -> [a] -> Maybe a such that for empty lists, it yields 'Nothing'. -- Frerich Raabe - raabe@froglogic.com www.froglogic.com - Multi-Platform GUI Testing
participants (2)
-
Frerich Raabe
-
Lai Boon Hui