我正在研究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)
所以我想知道我哪里出错了。感谢。
答案 0 :(得分:0)
我希望您的意思是Martin Odersky的progfun1
课程及其第2周的任务。我相信通常没有解决这个问题的方法(它需要找到一个特定函数的反函数,我怀疑它是否真的可能)并且课程作者对此有所了解。因此,他们添加了一个您可能错过的额外限制(我强调了重要部分):
请注意,没有直接的方法可以找到集合中的元素。
contains
仅允许知道是否包含给定元素。因此,如果我们希望对集合的所有元素执行某些操作,那么我们必须迭代所有整数,每次测试它是否包含在集合中,如果是,则对其执行某些操作。 在此,我们认为整数x的属性为-1000&lt; = x&lt; = 1000,以限制搜索空间。
虽然它是对forall
任务的评论,但它位于同一部分,只是map
任务上方的几个段落。