Albert Y. C. Lai trebla at vex.net
Wed Feb 21 12:56:13 EST 2007

Henning Thielemann wrote:
> At
>   it is described, how database queries can be modelled with a monad.
> However, I wonder if this is also possible without monads. Say, writing
>
> "DB.map col1 \$ DB.filter (\row -> col2 row == 10+2) myTable"
>
> for
>
> "SELECT col1 FROM MyTable where col2 = 10+2"

If and only if the database is a purely functional immutable data
structure, this can be done. This is because the \$ operator, function
application, is used for control and/or dataflow.

Many interesting databases are not purely functional immutable; most
reside in the external world and can spontaneously change behind your
program's back. The >>= operator generalizes from function application
to these cases. Thus the monadic way subsumes the functional way and
covers other uses.

You can also make it an arrow. You can also make it an applicative.