SML列表相等奇数

时间:2010-12-16 18:13:37

标签: sml smlnj

我有这段代码:

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 个答案:

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