【问题标题】:SML : how to compare (< or >) two equality typesSML:如何比较(< 或 >)两种相等类型
【发布时间】:2017-09-15 15:27:51
【问题描述】:

我在使用 SML 中的以下代码时遇到问题:

fun inter s1 s2 =
  let
    fun inter' [] _ interSet = interSet
      | inter' _ [] interSet = interSet 
      | inter' (x1::s1) (x2::s2) interSet =
            if x1=x2 then
                inter' s1 s2 (x1::interSet) (* Add the value to the intersection and advance in both s1 and s2*)
            else if x1 < x2 then
                inter' s1 (x2::s2) interSet (* Keep going through s1 *)
            else
                inter' (x1::s1) s2 interSet (* Keep going through s2 *)
   in
      if s1=[] orelse s2=[] then []
      else                          
        inter' s1 s2 []
end;

inter 函数返回一个列表,其中包含两个 ORDERED 列表 s1 和 s2 之间的交集(即在 s1 和 s2 中找到的值)。我期待它适用于所有相等类型,但函数类型是:

val inter = fn: int list -> int list -> int list

为什么不是:

val inter = fn: ''a list -> ''a list -> ''a list    ?

看来问题出在

x1 < x2

我认为

【问题讨论】:

  • 如果对您有帮助,请不要忘记将答案标记为已接受。另外,为他们投票。

标签: sml


【解决方案1】:

是的,你错误地相信了这一点。如果相等类型支持排序,它们可能被称为有序类型。 ;)

您需要做的是将比较运算符作为参数传递给inter 函数。或者,如果这是更大模块的一部分,您可以考虑将其设为仿函数。在这两种情况下,我建议不要传递小于运算符,而是传递 3 路函数 compare : 'a * 'a -&gt; order,这是为每种内置类型预定义的,例如 Int.compare

【讨论】:

  • 感谢您的回答!现在这一切都说得通了:)。
猜你喜欢
  • 2018-04-17
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
相关资源
最近更新 更多