【问题标题】:Reference to anonymous value in Scala在 Scala 中引用匿名值
【发布时间】:2013-11-01 08:32:48
【问题描述】:

我接了“99 Scala Problems”,遇到了Problem 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”列表实际上将在内部表示。我们可以访问这个内部表示吗?还是我们真的应该避免?

【问题讨论】:

    标签: scala anonymous


    【解决方案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))
    

    【讨论】:

    • 我喜欢这种方法!将公开集合而不是元素的通用函数。受此启发,我设法通过将 listPrimesinRange 包含在 List[List] 中来做到这一点: List(listPrimesinRange(2 to n)).flatMap(pr => pr.filter(x=> pr.contains(n-x)) ).takeWhile(x=> x (x,n-x)) 请注意,“takewhile”已重新定位。它不能在原来的地方工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多