Wednesday, December 29, 2010

Assignment Considered Harmful

One of the things I got myself for Christmas was Chris Reade's Elements of Functional Programming. Despite being nowhere near done with some other books I'm working through, I cracked it open today.  Page three has the following gem: "From this point of view, it is argued that the assignment statement is considered harmful in high-level languages, just as the 'goto' statement was considered harmful for structured programming in the sixties (Dijkstra, 1968).  Note that it is the use of assignments that takes most of the blame for not allowing separation of concerns when programming."

That's a pretty bold statement, no?  However, Chris Reade is somewhat less widely read than E. Dijkstra; googling for either "assignment considered harmful" (or variants) shows no front page hits that trace back to Reade.  Much as I am inclined to agree with that statement, I recognize that my opinion is rooted in many years' experience with the complexities involved in programming with traditional assignment semantics, and have not had nearly as much opportunity to see the downside of purely functional programming. 

So what did I find when I googled for "assignment considered harmful?"  Well, not much that was actually on topic.  The functional programming outlook was represented by this blog post.  From a different viewpoint, there was this paper, which looks at four different semantics for "x=y", none of which involves immutable data, and concludes that traditional assignment semantics are the worst of the four options!

Sunday, December 5, 2010

The Type of []

That should be "The Type of []", but it seems that blogger won't let you change the font on the heading. 

Anyway, so the section of Learn You A Haskell where it introduces value constructors says this: "Value constructors are actually functions that ultimately return a value of a data type."  (For example, Just is function that takes an argument of type a and returns a value of type Maybe a).  That seemed pretty straightforward and I think I internalized it well on the first pass.  

The LYAH section on type constructors also mentions the fact that type constructors are functions.  So I kind of knew that fact but didn't really know it until I got unto the Functor section and the explanation that fmap is just a generalization of map.   Because the type of fmap is (Functor f) => (a->b) -> f a -> f b.  My brain began to rewind a bit, trying to figure out how [Int] fit the type signature f a with a bound to Int.  Then it hit me that [] is just syntactic sugar for a type constructor, which is just a function that creates a type. I'm just so used to that class of objects being builtin language keywords that this took more than a bit of adjustment.

In other languages, list<int> myList is just a set of keywords you say to make the compiler give you a list of integers; a compiler feature or even a compiler-level function if you will.  Haskell gives you the list type constructor as an actual function.  EDIT: The function is evaluated at compile time, but it is nonetheless a function. 

The Haskell Road . . .

Time for another quick book report.  The Haskell Road to Logic, Maths, and Programming advertises itself as a from-the-bootstraps guide to, well, logic, math, and programming.  I've finished the first 4 chapters, a little more than a third of the book.  What do I think so far?

It's a very good guide to the foundations of mathematics.  Though I have a math degree, this is something that never really clicked for me before.  The ad copy states the only knowledge the book presumes is secondary school mathematics. I don't have that perspective, but I think the book does a good job of explaining the foundations of mathematics without assuming any more knowledge than that.  I'm not so sure it's as successful on the programming side -- I think there are several places where a reader with no programming experience would be quite confused about the example programs.

It seems to me that the book's real target audience is programmers who want to learn some Haskell and learn the fundamentals of logic and math and how to use formal methods in Haskell.  So far, it accomplishes those goals fabulously.