2017-08-02 50 views
1

我正在使用Coursera的Scala教程。其中一个练习要求实现一个映射函数来设置类型,定义如下: type Set = Int => Boolean。有人支持功能存根:变换一组--Scala Coursera练习

/** 
* 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) 

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

+0

我想我明白了。我最终可能会将f应用于原本不是s的元素。所以我必须检查 –

+0

这个公式也是不正确的,因为它会告诉我转换后的值是否在原始集合中。不是我想要的 –

回答

0

我希望你的意思是Martin Odersky和其第2周的任务progfun1课程。我相信这个问题通常没有解决方案(它需要找到给定函数的反函数,我怀疑这是真的可能),课程作者也知道这个问题。因此,他们增加了一个额外的限制,你可能错过了(我强调的重要组成部分):

注意这里是要找到哪些元素是一组没有直接的方法。 contains只允许知道是否包含给定的元素。因此,如果我们希望对某个集合中的所有元素做些什么,那么我们必须迭代所有的整数,每次测试它是否包含在集合中,如果是,就用它做一些事情。 这里,我们认为整数x具有属性-1000 < = x < = 1000,以便限制搜索空间。

虽然它是为forall任务及以上map任务只是几段评论它是在同一节。

+0

是的,正确的。我意识到这一限制。我宁愿遇到问题。我现在明白了。 –