Thanks for all the good explanations! I was misdirected by the fact that the warning location was on the empty case, but based on descriptions I think I understand why now.

I find it interesting that there is a bit of a conflict between "good practice" heuristics:
  1. Use -Wall (to eliminate questionable code that triggers warnings), and
  2. Avoid _ in patterns in favor of explicit statement of the cases.
So it would appear that the advice (per Kim-Ee) to add an "otherwise" as a third guard allows me to satisfy the compiler while documenting to the human reader that the definition is really complete without it.

Thanks,
-jn-


On Tue, Feb 10, 2015 at 9:52 AM, Kim-Ee Yeoh <ky3@atamo.com> wrote:

On Tue, Feb 10, 2015 at 7:58 PM, Joel Neely <joel.neely@gmail.com> wrote:
sumDigits (n:ns)
  | n < 10       = n + sumDigits ns
  | n >= 10      = r + sumDigits (q : ns)
  where (q, r)   = n `quotRem` 10

To reiterate what Mike and Brandon just said, it's not that both the [] and (n:ns) cases have not been covered. They have.

It's that the (n:ns) case hasn't been covered completely because of the guards.

This will work:

sumDigits (n:ns)
  | n < 10       = n + sumDigits ns
  | otherwise    = r + sumDigits (q : ns)

As will this:

sumDigits (n:ns)
  | n < 10       = n + sumDigits ns
  | n >= 10      = r + sumDigits (q : ns)
  | otherwise    = error "will never fire, only to suppress spurious warning"

There's also -fno-warn-incomplete-patterns.

-- Kim-Ee

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners




--
Beauty of style and harmony and grace and good rhythm depend on simplicity. - Plato