我有这段代码:
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中时,实数不是相等类型。任何人都可以帮我解释为什么会出现这种魔法吗?
答案 0 :(得分: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 +
添加类型注释,甚至可以引发类型错误,这基本上使我得出结论:导致神秘效果的+
重载。 / p>