[Haskell-cafe] Things to avoid (Was: Top 20 ``things'' to know in
Haskell)
Remi Turk
rturk at science.uva.nl
Thu Feb 10 18:10:28 EST 2005
On Wed, Feb 09, 2005 at 02:54:12PM +0100, Henning Thielemann wrote:
>
> On Wed, 9 Feb 2005, Henning Thielemann wrote:
> > Is there also a Wiki page about things you should avoid?
>
> Since I couldn't find one, I started one on my own:
>
> http://www.haskell.org/hawiki/ThingsToAvoid
>
> I consider 'length', guards and proper recursion anchors.
Okay, I still definitely have some problems with the part about
guards, and I'm going on bothering you about it because it's The
HaWiki, and not just your site ;)
First of all, I rarely combine multiple-defs with guards, and
even more rarely omit an otherwise- or all-variables-and-no-guard
case, so I may just have avoided all stated problems that way.
Second, I don't have much experience with Haskell-newbies
(besides my own (hopefully) past and the ones on the mailing
lists), so my assumptions about common pitfalls may well be
wrong.
That said, the points I don't agree with:
1) It's talking about the compiler having difficulty with some
warnings when using guards. In none of the examples given (the
primes) I got any warnings, and from a quick made up example
it appears that at least GHC is quite capable of detecting
non-exhaustive patterns even when combining patterns and
guards. In case you're talking about something like this:
f x | odd x = ...
| even x = ...
GHC does complain. I would also call it Bad Code,
but if it's what you mean, _this_ example should be in the
wiki. (As in: blahblah, it actually _is_ exhaustive, but in
general requires solving the halting-problem to prove or
something like that ;)
Also, when compiling them (even _without_ optimizations) the
three examples yield _exactly_ the same code, except for the
fact that the if-then-else example moves the "n == 2"
comparision to the RHS of the expression. This move can just
as easy be done on the guarded version, which removes any
difference in generated code/warnings.
2) foo xs | length xs == 1 = bar (head xs)
As already said in "Don't ask for the length of a list, if you
don't need it", this usage of length is bad in itself, and
doesn't really help the argument against patterns IMO.
3) the pattern guards extension.
I have two objections against this one. First, I don't think
it's a good idea to talk about a non-standard extension like
pattern guards in a wiki about newbie-problems. (Unless in the
sense of "there are some compiler extensions which you
probably won't need anytime soon.") Second, it's just horrible
code: A useless violation of DRY (Don't Repeat Yourself).
Groeten,
Remi
P.S. I _do_ agree with most of the other points ;)
P.P.S. Does a piece about "Avoid explicit lambda's" stand any
chance of not being removed?
(Basically about "\x y -> x + y" vs "(+)", and "when it
gets more complicated it probably deserves a name.")
--
Nobody can be exactly like me. Even I have trouble doing it.
More information about the Haskell-Cafe
mailing list