6

私はこのビットのコードを持っています:

fun foldr2(f, x::xs) =
    if xs = [] then
      x
    else
      f(x, foldr2(f, xs))

型シグネチャ付き

(''a * ''a -> ''a) * ''a list -> ''a

xs = []かなり単純に見えますが、比較のために、等値型と等値型のリストを引数として機能する関数を取ります。ただし、何らかの理由で(op +, [2.3, 2.7, 4.0])、SML/NJ 実数が等値型でない場合、 などの入力で機能します。この魔法が発生する理由を明らかにするのを手伝ってくれる人はいますか?

4

1 に答える 1

2

私はそれ+が本当の過負荷の魔法の方法に関係していると信じています. 私には、これはほとんどコンパイラのバグであると言えますが、正しい動作が意図されていることを正確に確認するには、SML97 の定義を確認する必要があります。オーバーロード+は、SML、私見の厄介な暗いコーナーのようなものです。

たとえば、型の関数を定義し、それをreal * real -> real引数として渡すと、foldr2予期していた型エラーが発生します。

fun f (x : real * real) = 134.5
foldr2 (f, [1.4, 2.25, 7.0])
  stdIn:8.1-8.29 Error: operator and operand don't agree [equality type required]

op +に型注釈を追加するだけで型エラーを誘発することさえできます+.

于 2011-01-03T08:02:22.500 に答える