如何在 SML/NJ 中编写一个函数,将列表中的元素排序为等价的 类?

How to write a function in SML/NJ that sorts the elements from a list into equivalence classes?

我必须在 SML/NJ 中编写一个函数,将列表中的元素排序为等价的 classes。每个等价项 class 中的元素顺序应与原始列表中的顺序相同。等价关系由函数 f 给出,如果两个元素等价,则 returns 为真。

该函数应如下所示:

fun equivalenceClasses (f: ''a * ''a -> bool, xs: ''a list): ''a list list

我只能使用匿名函数和结构 List、ListPair 和 Math。

我不知道该怎么做。有人可以帮我吗?

假设我给了你一个等价列表类。你能想出如何在该列表中再插入一个元素吗?

例如,假设元素是字符串,等价物类是等长的字符串。那么列表 [["fox","the","dog"],["brown","jumps"],["over","lazy"]] 是一个等价列表 类,因为例如"fox""dog"等长,"brown""jumps"等等

如果我们现在将字符串 "quick" 插入到 类 的列表中,结果应该是什么样的?显然它应该被添加到列表 ["brown","jumps"],所以结果可能看起来像 [["fox","the","dog"],["quick","brown","jumps"],["over","lazy"]]

一旦你解决了这个问题,剩下的就很简单了。这里有一个提示:

fun equivalenceClasses (f, xs) =
  case xs of
    [] => ???
  | x :: xs' => let
                  val c = equivalenceClasses xs'
                in
                  ???
                end