純粋関数型言語とO/R mapper
DBアクセスをサポートする現代的なプログラミング言語には、O/R mapperが欠かせないような気がするのだけれど、本当にそうでしょうか? なんて書く以上は、そうではないことを考えているのですけれど。
そもそも、何故O/R mapperというものが存在するかといえば、SQLとオブジェクト指向言語の親和性があまりにも低くて、SQLの構造に依存したドライバの類がことごとく使いにくいために、言語の特性に近いインターフェースのライブラリで、その部分を上手く隠してやりたいという欲求から出たものではないかと思っているのですが。。。(もうちょっと考えると、オブジェクト指向言語の手続き型的な側面が、SQLとの親和性を低くしているので、言語のオブジェクト指向的なところを上手く使って宣言的な記述に近づけたライブラリが、O/R mapperの意味なのではないかという風な仮説を立ててみたりしているのですが)
で、まあ、それが真であるとすれば、オブジェクト指向言語よりも宣言的な記述が得意な言語ならば、O/R mapperを使わないで、もっと直接的にSQLとプログラミング言語を親和的に使うことができるのではないかと想像してみます。
ls = select name, height, weight from health_checks
のように記述すれば、{name, height, weight}で構成されたレコードの遅延リストが得られるようなライブラリならどうでしょう? それが容易に実現可能な言語ならば、O/R mapperというものはそもそもそのような概念すら不要になることはないでしょうか? CleanやHaskellといった純粋関数型言語はそのような利用方法が非常に適しているような気がします。
SQLというのは、それ自身、かなり記述力のある言語なので、O/R mapperのような窮屈なライブラリを間にはさんで、その能力に大きな制限をかける利用方法には、以前から疑問に思っていて、しかし、そうはいっても、一般のプログラミング言語でSQLを取り扱うのは結構しんどいコーディングなので、いい方法があればと思っているのですが。