我有这段代码:
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实时不是相等类型时 . 任何人都可以帮助我解释为什么这种魔法发生?
1 回答
我相信它与
+
为实际重载的神奇方式有关 . 对我来说,这几乎是一个编译器错误,尽管我必须查看SML97定义,以确切了解正确的行为是什么 . 恕我直言,超载+
是SML中一个令人讨厌的黑暗角落 .例如,如果您定义一个类型为
real * real -> real
的函数并将其作为参数传递给foldr2
,则会出现您期望的类型错误:如果你只是在
op +
中添加一个类型注释,你甚至可以引发类型错误,这基本上让我得出的结论是+
的重载导致了神秘的效果 .