SML 中的自定义比较器排序?

Custom comparator sort in SML?

我对 SML/SMLNJ 中的这个问题有点困惑,我希望得到一些指导。 所以我遇到了一个问题,我需要创建一个名为 insertSorted 的函数,它需要一个数字、一个比较语句和一个需要插入的(假设排序的)列表。我不确定如何开始处理这个问题,所以任何帮助都会很棒。

我的想法是将两个列表分开,插入数字,然后连接两个列表。

fun insertSorted (x, comp, []) = [x] 
  |  insertSorted (x, comp, a::rest) = ...

更新:我说得有点远了,我只需要知道如何调试它,有什么指导吗?

fun insertSorted (x, []) = [x]
 |  insertSorted (x, y::ys) = 
    if (x < y)
        then x::y::ys
    else if (x > y) 
        then y::x::ys
    else y::insertSorted (x, ys);

更新 2:我的新目标是弄清楚如何将这两个功能合并为一个。最终命名为 insertSorted.

fun insertSorted (x, nil) = [x]
 |  insertSorted (x,y::ys) = if x<y then x::y::ys else y :: insertSorted (x,ys);

fun insertSorted (x, nil) = [x]
 |  insertSorted (x,y::ys) = if x>y then y::x::ys else y :: insertSorted (x,ys);

分三种情况:

  1. 名单是nil
    • 你已经讲过了。 :-)
  2. 列表不是nil,它的第一个元素小于x,所以我们需要一直寻找插入的地方x
    • 在这种情况下,结果应该是第一个元素,然后是将 x 插入列表其余部分的结果。
  3. 列表不是nil,它的第一个元素大于或等于x,所以我们可以在这里插入x
    • 在这种情况下,结果应为 x,后跟整个列表。

区分案例 #2 和 #3 涉及 if/then/else;实施案例 #2 涉及递归。