1

我学习了“ 99 Scala Problems ”,遇到了问题 40,即哥德巴赫猜想。

我想出了这个解决方案,它实际上输出所有素数对,其总和是给定的数字:

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 内部结构的机会;在这种比喻性的单线方法中,最初的“lPrimes”列表实际上将在内部表示。我们可以访问这个内部表示吗?或者这是我们真的应该避免的事情?

4

1 回答 1

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))
于 2013-11-01T09:39:48.690 回答