集合之间的并集

13
我正在参加Coursera上的Scala函数式编程课程,现在是第二周,但我遇到了问题。我们正在处理集合(Set),但这跟Java中常见的那种Set不一样。它是一个函数,如果值存在于集合中,则返回true,否则返回false。他们说它不是一个容器,而只是一个函数。
为了更好地理解,我需要您的帮助。我不想让您帮我解决作业,只是想通过例子来理解应该做什么。
/**
   * We represent a set by its characteristic function, i.e.
   * its `contains` predicate.
   */
  type Set = Int => Boolean

 /**
   * Indicates whether a set contains a given element.
   */
  def contains(s: Set, elem: Int): Boolean = s(elem)

 /**
   * Returns the set of the one given element.
   */
  def singletonSet(elem: Int): Set = Set(elem)

 /**
   * Returns the union of the two given sets,
   * the sets of all elements that are in either `s` or `t`.
   */
  def union(s: Set, t: Set): Set = ???  

这是代码。在singletonSet中,我猜解决方法是返回Set(elem),对吗?
如果可以,请问我该如何使两者之间进行并集操作?虽然我不是编程新手,但我无法看到任何方法来完成它。因为我不应该返回数字的“set”。
另一个学生告诉我关于集合的内容:“但是,所有“Set”都是将Int作为输入并返回布尔值(Int => Boolean)的函数。任何将Int作为输入并返回布尔值的函数都适用于类型'Set'。”
在并集函数中,我尝试了类似以下的方法:
def union(s: Set, t: Set): Set = (s | t) //value | not a member of Int => Boolean  

非常感谢您的帮助 :)


有趣的是,https://dev59.com/nWcs5IYBdhLWcg3wMxFF 实际上是相同的问题,而且它仍然是开放的。在我看来,两个问题都应该是开放的,因为它们都是有效的问题。 - talonx
2个回答

35

看起来你遇到的难题是不熟悉如何在Scala中定义函数。在这种情况下,您需要定义类型为Int => Boolean的函数,它们接受Int并返回Boolean

以下是一些类型为Int => Boolean的函数字面量示例。可以在Scala控制台或Scala IDE工作表中尝试:

(x: Int) => true
(x: Int) => false
(x: Int) => x == 2
(x: Int) => x == 10
(x: Int) => x == 2 || x == 10
(x: Int) => x % 2 == 0

那么,你只需要使用相同的语法来完成这个任务,从(x: Int) =>开始,然后将union、intersect等的含义转换为表达式的右侧即可。

学习的一部分是要真正付出努力。我相信你可以多次提交解决方案,所以如果第一次没有得到10/10分,请不要犹豫提交和迭代。你只需要编译代码。祝你好运!


8
一个可能的提示是看类型。看一下 Set 类型。它实际上是一个从 IntBoolean 的函数的类型别名。
因此,当您有两个集合时,实际上有两个函数。如何使用它们来提供表示这些集合的联合的函数?这必须是您的起点。

我会在这两个函数之间进行一个OR操作,但我还需要一个X。我无法得出更好的答案。 - Andrew
1
你忘记了更重要的事实:Set是一个函数的别名。你的X就来自于它:你必须返回一个函数,解释如何处理“外部”的X - Nicolas
所以这是两个集合之间的OR吗?我尝试过这样做,但是使用“s | t”不起作用,它会显示“value | is not a member of Int => Boolean”。 - Andrew
7
你有两个函数 Int => Boolean,你的结果也是 Int => Boolean。因此,你必须从这两个初始函数构建自己的函数:x => f(x) || g(x) - Nicolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接