13

我正在学习 Scala 课程的 Coursera 函数式编程。这是第二周,我碰壁了。在作业中,我们使用的是 Set,但不是我们在 Java 中遇到的那种 Set,例如。它是一个 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),对吗?

如果这很好,我应该如何在两者之间建立联盟?我对编程并不陌生,但我看不到任何方法。因为我不应该返回一组数字。

这是另一个学生告诉我的关于集合的内容:“但是所有的“集合”都是一个接受一个 Int 并返回一个布尔值 (Int => Boolean) 的函数。任何接受一个 Int 并返回一个布尔值的函数都适合类型'设置'。

我在 union 函数中尝试的是:

def union(s: Set, t: Set): Set = (s | t) //value | not a member of Int => Boolean  

任何帮助,将不胜感激 :)

4

2 回答 2

35

看来您遇到的障碍是您不熟悉在 Scala 中定义函数。在这种特殊情况下,您需要定义 type 的函数Int => Boolean,它们接受 aInt并返回 a 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,请不要犹豫提交并迭代。您所需要的只是编译代码。祝你好运!

于 2012-09-29T14:43:27.827 回答
8

一个可能的提示是查看类型。看Set类型。它实际上是Intinto函数的类型别名Boolean

因此,当你有两个集合时,你实际上有两个功能。你如何使用它们来提供一个代表这些集合并集的函数?它必须是你的起点。

于 2012-09-29T08:37:02.743 回答