[Haskell-cafe] First time haskell - parse error!

Tillmann Rendel rendel at Mathematik.Uni-Marburg.de
Wed Mar 10 12:01:34 EST 2010


Ketil Malde wrote:
> Also, good names are harder than they sound: I don't think
> 'belowLimit' is a good name for 'takeWhile (<10000)', for instance.
> I certainly couldn't guess what it was for without looking at the
> implementation, which kind of defeats the purpose of names for 
> improving code clarity, don't you think?

I don't. I would not expect to understand the behavior of a piece of 
code just by reading its name.

However, a good name can help you understand the purpose of the code 
while reading it, and after reading the code, you may link the name to 
the same concept as the original author did. This way, the original 
author can help you rediscover his understanding of the problem by 
structuring the code accordingly.

But that means that names should not be introduced to break long 
expressions into short ones, but to point out structure. For example, 
the structure of the oddSquareSum example is a (.)-pipeline. We could 
highlight this fact by giving a name to each function in the pipeline.

   oddSquareSum
     = sum . belowLimit . onlyOdd . squareAll $ numbers
     where
       belowLimit = takeWhile (< 10000)
       onlyOdd = filter odd
       squareAll = map (^ 2)
       numbers = [1..]

However, in this version of the code, we obfuscate an important aspect 
of the structure of the pipeline: It is a pipeline working on lists. I 
would like to make this more visible, e.g. like this:

   oddSquareSum
     = sum . takeWhile belowLimit . filter odd . map square $ numbers
     where
       belowLimit x = x < 10000
       square x = x * x
       numbers = [1..]

In this version, we see the structure of the code in the pipeline, and 
the details in the local definitions. Furthermore, I would expect a 
reader to be able to remember the meaning of the names after having read 
the definitions.

   Tillmann


More information about the Haskell-Cafe mailing list