2011-06-26 90 views
10

尝试生成显示主要因子多重性的元组列表...想法是将排序列表中的每个整数与元组中的第一个值进行匹配,并使用第二个值进行计数。可能用takeWhile更容易做到,但是。不幸的是我的解决方案将无法编译:模式匹配过程中需要稳定的标识符? (Scala)

def primeFactorMultiplicity (primeFactors: List[Int]) = { 

    primeFactors.foldRight (List[(Int, Int)]()) ((a, b) => (a, b) match { 
     case (_, Nil)  => (a, 1) :: b 
     case (b.head._1, _) => (a, b.head._2 + 1) :: b.tail 
     case _    => (a, 1) :: b 
    }) 
    } 

它说:“错误:需要稳定的标识符,但b.head._1发现。”但改变第二case线以下工作正常:

 case (i, _) if (i == b.head._1) => (a, b.head._2 + 1) :: b.tail 

这是为什么,为什么不能编译器处理,如果有这样一个简单的解决?

回答

14

模式中的变量捕获该位置的值;它确实不是做一个比较。如果语法完全工作,则结果将是将a的值写入b.head._1,覆盖当前值。这样做的目的是让你使用一种模式从复杂的结构中拉出一些东西。

+0

欢呼声中,貌似我不明白模式匹配是如何工作的。我应该在这些日子里读一本关于Scala的书。 –

+0

@Luigi:我建议你从这里开始http://www.artima.com/pins1ed/;) –

3

b.head._1不是为(x, y)元组提取

的结果,试试这个,而不是一个有效的名称:

case (x, _) if x == b.head._1 => (a, b.head._2 + 1) :: b.tail