转换集 - Scala Coursera练习

时间:2017-08-02 15:36:29

标签: scala

我正在研究Coursera的Scala教程。其中一个练习要求实现map函数来设置如下定义的类型: type Set = Int => Boolean。这个函数有一个存根:

/**
* Returns a set transformed by applying `f` to each element of `s`.
*/
def map(s: Set, f: Int => Int): Set = ???

我认为通过执行以下操作可以检查元素是否在s中: (x: Int) => s(x)。我认为应该相当于一个集合的定义。因此,如果我们想在集合上应用转换,我们可以这样做: (x: Int) => s(f(x))。所以函数的定义是: def map(s: Set, f: Int => Int): Set = s(f(x))。但是如果我尝试的话,这给了我一些奇怪的设置:

def map(s: Set, f: Int => Int): Set = (x: Int) => s(f(x))
  def toStringH(s: Set): String = {
    val xs = for (i <- -bound to bound if contains(s, i)) yield i
    xs.mkString("{", ",", "}")
  }
def printSet(s: Set) { println(toStringH(s)) }
val squaredSet = map((x: Int) => (x> -3 & x<3), (x:Int) => (x+1))
printSet(squaredSet)

所以我想知道我哪里出错了。感谢。

1 个答案:

答案 0 :(得分:0)

我希望您的意思是Martin Odersky的progfun1课程及其第2周的任务。我相信通常没有解决这个问题的方法(它需要找到一个特定函数的反函数,我怀疑它是否真的可能)并且课程作者对此有所了解。因此,他们添加了一个您可能错过的额外限制(我强调了重要部分):

  

请注意,没有直接的方法可以找到集合中的元素。 contains仅允许知道是否包含给定元素。因此,如果我们希望对集合的所有元素执行某些操作,那么我们必须迭代所有整数,每次测试它是否包含在集合中,如果是,则对其执行某些操作。 在此,我们认为整数x的属性为-1000&lt; = x&lt; = 1000,以限制搜索空间。

虽然它是对forall任务的评论,但它位于同一部分,只是map任务上方的几个段落。