我有这段代码:
fun foldr2(f, x::xs) =
if xs = [] then
x
else
f(x, foldr2(f, xs))
Run Code Online (Sandbox Code Playgroud)
带有类型签名
(''a * ''a -> ''a) * ''a list -> ''a
Run Code Online (Sandbox Code Playgroud)
由于xs = []比较,它看起来很直接,它需要一个适用于相等类型的函数和一个相等类型的列表作为参数.但是,由于某些原因,它适用于输入,例如(op +, [2.3, 2.7, 4.0]),当在SML/NJ实时中不是相等类型时.任何人都可以帮助我解释为什么这种魔法发生?
+我相信这与实数超载的神奇方式有关。对我来说,这几乎是一个编译器错误,尽管我必须查看 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]
Run Code Online (Sandbox Code Playgroud)
如果您只是向 中添加类型注释op +,您甚至可能会引发类型错误,这基本上使我得出这样的结论:它的重载+导致了神秘的效果。