Sat May 26 10:09:36 EST 2012

Automating the Bunkplan (in Haskell)

I had a working program for making the bunkplan and cabin sheets, but it was written in O'Caml. I need to make binaries that run on Windows and O'Caml's Windows support is atrocious. Not only that, but somehow the font-locking of emacs' ocaml-mode breaks font-lock in other modes. It wasn't long before I gave up and ported the thing to Haskell just to use the Haskell Platform.

Most of the code ported over fairly easily, but I decided to generate HTML using the platform's Text.Html library. Sadly, it suffers from a defect common to so many Haskell libraries: There's a big list of types, type classes and functions, but no documentation on how the bits are expected to fit together. It defines operators (<<), (+++) and (!), where (<<) stuffs some html inside another tag, (!) adds attributes to a tag and (+++) concatenates html fragments. Nowhere does it say that, and that one sentence would've seriously reduce the time it took to get myhead around the library. When I previously ranted about autogenerated documentation, someone emailed me and said that in most cases a combination of function name, argument names and function type are usually enough. I don't entirely agree - it seems to be true up to a certain threshold but falls down beyond that. This threshold appears to depend on the language; if the type system is less expressive (C, for example), the information in the type is easier to extract. When the type system is more expressive (Haskell), people build higher abstractions which means you hit the types-as-documentation threshold much sooner.

The code is in my repository, if you want to take a look.

Having finished the port, I realised that I've been solving the wrong problem. Everyone's happy with the excel watchbill and the version my software makes hasn't displaced it. (I didn't even bother writing haskell code to make the watchbill.) It's only sped up the generation of the cabin sheets - individual pages that list the occupants of one cabin (and are hung out the front of each cabin). Writing a program to make only cabin sheets will cut out about 99% of the input's complexity, which means someone else can prepare them.


Posted by Jack Kelly | Permanent link | File under: coding