【问题标题】:SML list equality oddnessSML 列表相等奇数
【发布时间】:2011-05-26 17:26:33
【问题描述】:

我有这段代码:

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,我也想知道为什么会这样。就好像 SML/NJ 将条件块转换为“null [2.3, 2.7, 4.0]”或类似的。

标签: sml smlnj


【解决方案1】:

我相信这与+ 实际超载的神奇方式有关。对我来说,这几乎几乎是一个编译器错误,尽管我必须查看 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 +添加类型注释,甚至可以引发类型错误,这基本上让我得出结论,是+的重载导致了神秘的效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 2023-03-14
    • 2016-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多