2013-11-01 90 views
1

我拿起「99 Scala Problems」,我碰到了這個是哥德巴赫猜想的Problem 40引用Scala中的匿名值

我想出了這個解決方案,實際上,輸出所有對素數,其和給定數:

def goldbach(n : Int) = { 
    val lprimes = listPrimesinRange(2 to n) // all primes less than n 
    lprimes.takeWhile(x=> x < (n-x)).filter(x=> lprimes.contains(n-x)).map(x=> (x,n-x)) 
} 

完美的作品,但不是一個班輪。這是因爲在過濾操作中,我們需要參考素數的初始列表。有沒有辦法寫這樣的事情:

def goldbach(n : Int) = { 
    listPrimesinRange(2 to n).takeWhile(x=> x < (n-x)).filter(x=> ???.contains(n-x)).map(x=> (x,n-x)) 
} 

...哪裏'???'會被適當的表達所取代?

好的,我知道爲匿名值請求「名稱」是自相矛盾的。但是,因爲我只是爲了好玩而解決這個問題,所以這是一個發現Scala內部事物的機會;在這種具有象徵意義的單行路線方法中,最初的'列邦'列表實際上將在內部表示。我們是否可以訪問這個內部表示?還是我們真的應該避免的東西?

回答

1

不,我不認爲這是可能的。您可以自己的擴展方法,它會像這樣工作:

implicit class RichAny[A](x: A) extends AnyVal { 
    def use(f: A => B) = f(x) // could have a better name 
} 

,並用它作爲

listPrimesinRange(2 to n).takeWhile(x=> x < (n-x)). 
    use(primes => primes.filter(x => primes.contains(n-x)) 
+0

我喜歡這樣的做法!一個通用函數,將公開集合,而不是元素。受此鼓舞,我設法通過將listPrimesinRange包含在List [List]中,如下所示: List(listPrimesinRange(2 to n))。flatMap(pr => pr.filter(x => pr.contains(nx )))。takeWhile(x => x <(nx))。map(x =>(x,nx)) 注意'takewhile'重新定位。它不會在原來的地方工作。 – theodojo