【问题标题】:How to write a function in SML/NJ that sorts the elements from a list into equivalence classes?如何在 SML/NJ 中编写一个函数,将列表中的元素分类为等价类?
【发布时间】:2018-11-18 06:12:13
【问题描述】:

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

函数应该如下所示:

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

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

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

【问题讨论】:

  • 欢迎来到 *,一月!我看到你发布了三个完整的练习,“我不知道怎么做,请帮忙”。在底部。如果您阅读how do I ask and answer homework questions?,这可能会激发您写出人们更愿意回答的问题。简单地回答家庭作业问题可能很有趣,但对任何人来说都没有什么价值。
  • 这个问题最近回答了here。 (本问答中的其他答案与其他函数式语言有关,因为提问者要求提供多种语言的解决方案,但目标是 SML 本身。)

标签: sml smlnj


【解决方案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

【讨论】: