我必须用SML / NJ编写一个函数,该函数将列表中的元素排序为等效类。每个对等类中元素的顺序应与原始列表中的顺序相同。等价关系由函数f给出,如果两个元素相等,则该函数返回true。
函数应如下所示:
fun equivalenceClasses (f: ''a * ''a -> bool, xs: ''a list): ''a list list
我只能使用匿名函数以及结构List,ListPair和Math。
我不知道该怎么做。有人可以帮我吗?
答案 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