1. happs intro
  2. the missing happs documentation
  3. getting started with happs
  4. prerequisites
  5. cabal install me
  6. main
  7. url handling
  8. templates
  9. stringtemplate basics
  10. form post data
  11. querystring get data
  12. macid data
  13. changing the data model
  14. cron jobs
  15. thanks

Real World HAppS

Haskell is a great way to program.

And HAppS is a great way to build web applications.

Especially if you believe, like I do, that as modern software systems tend toward ever increasing complexity, database usage is an unnecessary source of complication that should be factored out.

Ruby's rails and python's django have become popular largely because of their object relational mapping systems, which hide the complexity of database engines by converting application data manipulation logic into sql. When I first used an ORM, it felt like a huge improvement over writing sql statements every time I wanted to manipulate an application's state. But pretty soon ORMs started seeming hackish to me too. At some point, the metaphors I wanted to use just broke down.

HAppS is haskell's answer to rails and django (and perl's catalyst, and php). With HAppS, there is no wrangling data structures into and out of the database, because there is no database. You use whatever data structures are natural to your application, and serialize them transparently using powerful machinery that's running behind the scenes. And if there are existing databases that you need to connect to, you can do that too -- you're not locked in to using macid for everything.

MACID, the HAppS storage mechanism, is no vanilla serialization layer that will start acting in weird ways when an application has many concurrent users doing possibly conflicting things. By leveraging haskell's type system (see composable memory transactions paper), you get the same ACID guarantees that normally only come with a database.

You also get all the goodness that comes from programming in haskell, my favorite language.

In short, HAppS is awesome, and webmonkeys everywhere should use it. Except...

There is this one minor detail.