首页 文章

SML列表相等奇数

提问于
浏览
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实时不是相等类型时 . 任何人都可以帮助我解释为什么这种魔法发生?

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 + 中添加一个类型注释,你甚至可以引发类型错误,这基本上让我得出的结论是 + 的重载导致了神秘的效果 .

相关问题