関数型言語比較(思いつき系)

ocamlで本当にいいの?という疑問から、他の関数型言語をちょっとちゃんと調べてみようと思いました。
Haskell, Clean, Standard ML, Scheme, Lispといったあたりを比較してみました。
大体、以下のようにグルーピングできます。

静的型付け正格非純粋関数型言語(Meta Language系)
OCaml, Standard ML, F#
静的型付け非正格純粋遅延関数型言語
Haskell, Clean
動的型付け正格非純粋関数型言語Lisp系)
Lisp, Scheme

で、僕の判断基準として...
ま、ある程度の速度はほしいです。あと、インタプリタVMは避けたくて、実行モジュールが生成できるものがよいです。フリーソフトとして配布するつもりなので、あまりユーザーに手をかけさせるものは避けたいなと。
言語の仕様として、動的型付けは、あまり好きではないです。動的型付けは、簡単なことをするにはいいんですが、プロジェクトが大きくなるに従って後悔も大きくなるような・・・。というわけで、動作速度と動的型付けの観点から、Lisp系はまず脱落。
ところで、正格、純粋、遅延の意味ですが、(あと、おまけで、Memoiseと型推論も)

正格
処理順序が決まっている
純粋(参照透過)
代入などの副作用のある処理がない
遅延
値が必要となるまで評価を行わない
Memoise
一度評価した関数の値を記憶して、2回目は記憶した値を返す(つまり、関数の中は評価しない)←副作用がないことが前提
型推論
静的型付け言語で、型をいちいち宣言しなくても、「推論」によって変数の型が決まること

ということらしいです。非正格と遅延は表裏一体のような気もしますが、どうなんでしょ。(ところで、ここに書きなぐったキーワードでインターネットを探してみると、結構いろんな情報が出てくるものです。)
で、非純粋関数型言語OCaml)よりも、純粋関数型言語Haskellなど)の方が、言語としてより先進的なようなのですが、実用的になるにはまだいくつかのハードルを抱えているようで、たとえば、入出力に問題があるようです。非正格のために処理順序が決まらないことと、参照透過のために書き込みや読み出しなどの副作用のある処理ができないという言語の仕様を、どのように入出力処理と整合性を取るかと言うことに、まだ現実的な解がないのかなというのが、ざっと見た印象です。Haskellはこれをモナドという概念を用いて取り扱おうとしているようですが、これにはいろいろ議論があるようで・・・。
ということで、ひとまずは、実用性を取って、OCamlにするということで、結論にしたいと思います。