fun構文

fun len []     = 0
  | len (h::t) = 1 + len t;

この書き方は、どうも納得いかない。

は関数適用よりも結合度が弱いので、(h::t)のように括弧が必要になるのはわかるが、fun構文の中だけ特別扱いしても良いのではないかと思う。先頭は関数名に決まっているのだから。

というか、パターン毎に同じ関数名を書くこと自体が無駄ではないか?

fun len []   = 0
      | h::t = 1 + len t;

と書ける方が良いと思うのだが。

演算子の定義の場合、毎回"op"と書くのは異様な感じがする。

fun op @ (0,b) = b
  | op @ (a,b) = a * b;