>>632
"tl(L) = nil" のところで = で比較しちゃってるので L の要素が
equality type でなきゃいけない。で、real は同値判定「できない」
ことになってるんでこういうエラーがでる。
こういうときは null 関数とかパターンマッチを使おう。
sml 使いが一度はハマル FAQ だね。

あと、632 のプログラムだと list_max(tl(L)) を2回計算してるんで
値の順序によっては30要素くらいでもう値が返ってこなくなるよ。
ちゃんと let とかを使おう。

fun list_max [x : real] = x
| list_max (hd::tl) =
let val tl_max = list_max tl
in
if hd > tl_max then hd else tl_max
end;

元のスタイルのままパターンマッチにしてみた。

ちなみに、real list 同士が比較できない理由だけど、
[1.0] = [1.0] を判定するためには 1.0 = 1.0 の判定が必要だよね。
real 同士が = 比較できないんだからこれは無理。
nil の場合だけ特別扱い……なんてことはしてくれない。