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 回答