[Haskell-cafe] First time haskell - parse error!
Ketil Malde
ketil at malde.org
Wed Mar 10 06:21:38 EST 2010
Miguel Mitrofanov <miguelimo38 at yandex.ru> writes:
> Maybe it's just me, but I think composition chain is MUCH easier to read.
I definitely agree.
[Cited from "Learn You a Haskell for Great Good"]
>> oddSquareSum :: Integer
>> oddSquareSum = sum . takeWhile (<10000) . filter odd . map (^2) $ [1..]
>> oddSquareSum :: Integer
>> oddSquareSum =
>> let oddSquares = filter odd $ map (^2) [1..]
>> belowLimit = takeWhile (<10000) oddSquares
>> in sum belowLimit
To me, the first one is very clear, and exposes the function as what it
is: a neat, linear pipeline of standard function applications. You
don't have to be a very seasoned programmer to quickly identify this
structure, or the components involved.
Introducing names means that I need to keep the temporary definitions in my
head, and I think "takeWhile (<10000)" is as clear as it can get. And
while a name can be misleading (belowLimit is a boolean, no?) or flat
out wrong, the definition has its semantics¹.
Another, perhaps graver issue, is that the names obscure the linearity
of the function. I now need to check that the temporary defintions don't
recurse or perform other tricks.²
Named values are just like comments, which IMO also should be kept to a
bare minimum. A bit tongue in cheek: If you need a name to understand
what a function does, or a comment to understand how it does it, then
your code is too complicated.
-k (who still doesn't name all his functions 'foo')
¹ Which are perhaps not-so-defined. Thanks for bringing it up.
² There are plenty of point-free examples that overload my mind -- I
wonder if this might be when you start to linearize non-linear structures,
composing dots and combinators and whatnot?
--
If I haven't seen further, it is by standing in the footprints of giants
More information about the Haskell-Cafe
mailing list