2010-12-16 6 views
6

私はこのコードのビットがあります。型シグネチャSMLリスト平等奇数判定は

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

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

はかなり単純明快に見えますが、それは平等タイプ上で動作機能とリストを取り比較としてxs = []があるため、引数として等価型を指定します。しかし何らかの理由で、(op +, [2.3, 2.7, 4.0])のような入力で動作しますが、SML/NJのrealsは等価型ではありません。誰でも私がこの魔法がなぜ起こるのかを明らかにする手助けはできますか?

+1

+1、私はまた、これがなぜ機能するのだろうか。これは、SML/NJが条件ブロックを「null [2.3,2.7,4.0]」またはそれに類するものに変換するのと同じです。 –

答えて

2

私はそれが+が本当のために過負荷になっているという魔法の方法と関係していると信じています。私には、ほぼは、コンパイラのバグであると言いますが、SML97の定義を見て、正しい振る舞いを正確に見なければなりません。 +以上のオーバーロードは、SML、IMHOの厄介な暗いコーナーのようなものです。

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] 

あなたも、あなたの場合は型エラーを誘発することができます:あなたはタイプreal * real -> realのある関数を定義し、foldr2への引数としてそれを渡す場合

たとえば、あなたが期待していたタイプのエラーを取得しますタイプアナメーションをop +に追加するだけで、基本的に私には不思議な効果を引き起こすのは+のオーバーロードであるという結論に導かれました。