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內部事物的機會;在這種具有象徵意義的單行路線方法中,最初的'列邦'列表實際上將在內部表示。我們是否可以訪問這個內部表示?還是我們真的應該避免的東西?
我喜歡這樣的做法!一個通用函數,將公開集合,而不是元素。受此鼓舞,我設法通過將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