[Haskell-cafe] An interesting paper from Google

Andrew Coppin andrewcoppin at btinternet.com
Fri Oct 15 16:28:09 EDT 2010


I'm sure some of you have seen this already. For those who lack the time 
or inclination to read through the (six) pages of this report, here's 
the summary...

We [i.e., the report authors] took a production Python system and 
rewrote bits of it in Haskell, some of which is now in production use. 
We conclude the following:

- Python lets you just do whatever the hell you want, but Haskell 
demands that you actually have a *plan* before you start churning out 
code and running it. The result is generally cleaner and more consistent 
when you get there.

- Haskell's much-criticised immutable data is actually an *advantage* 
for backtracking search problems.

- Haskell wins for thread-safety.

- ADTs are nicer than exceptions.

- The parts of Haskell stolen by Python aren't as nice in Python as they 
are in Haskell. [Well, duh.]

- We like what GHC provides for profiling.

- We are dissappointed by what GHC provides for debugging.

- "String" is too slow. None of the alternatives seem to be widely 
supported. If your library consumes Strings and returns Strings, the 
fact that ByteString exists doesn't help you.

- Recent changes to GHC broke our code. (Specifically, extensible 
exceptions.) We were quite surprised that such a "stable" and "mature" 
system as GHC would do this to us.

- Haskell has quite a high barrier to entry. [Again, duh.]

The paper also contains an interesting section that basically says "we 
tried porting the Python implementing of XYZ into Haskell, but there 
wasn't really any advantage because it's all I/O". In my humble opinion, 
"it's all I/O" is a common beginner's mistake. Reading between the 
lines, it sounds like they wrote the whole thing in the IO monad, and 
then decided it looked just like the existing Python code so there 
wasn't much point in continuing. I guess it's one of the bad habits that 
imperative programmers get into. With a little more experience, you 
eventually figure out that you can limit the stuff actually in the IO 
monad to a surprisingly small section, and so almost everything else in 
pure code, no matter how much the problem looks like it's "all I/O". But 
anyway, I'm only guessing from what I can actually see with my own eyes 
in the report itself.

I'm surprised about the profiler. They seem really, really impressed 
with it. Which is interesting to me, since I can never seen to get 
anything sensible out of it. It always seems to claim that my program is 
spending 80% of its runtime executing zipWith or something equally 
absurd. I'm unsurprised which their dissappointment with debugging. I'm 
still quite surprised that there's no tool anywhere which will trivially 
print out the reduction sequence for executing an expression. You'd 
think this would be laughably easy, and yet nobody has done it yet.

Their comments about String are sadly true.

More information about the Haskell-Cafe mailing list