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

时间:2018-11-17 21:06:38

标签: sml smlnj

我必须用SML / NJ编写一个函数,该函数将列表中的元素排序为等效类。每个对等类中元素的顺序应与原始列表中的顺序相同。等价关系由函数f给出,如果两个元素相等,则该函数返回true。

函数应如下所示:

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

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

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

1 个答案:

答案 0 :(得分:1)

假设我给您列出了一个等效类。您能弄清楚如何在该列表中再插入一个元素吗?

例如,假设元素是字符串,而等价类是长度相等的字符串。那么列表[["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