2017-08-02 28 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

是的,正確的。我意識到這一限制。我寧願遇到問題。我現在明白了。 –