SML:如何比较(<或>)两个相等类型

时间:2017-09-14 20:28:02

标签: sml

我在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

我是否认为&lt;运算符是否为所有相等类型重载?难道它不能比较字符串吗?

1 个答案:

答案 0 :(得分:3)

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

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