2016-12-07 9 views
1

上のパターンヘッド/テール私は末尾再帰メソッドを作成しようとしているが、私は地図を使用していると私は/地図がnull /空であるかどうかをチェックするためにパターンマッチングを使用する方法を知っていると頭を得ることはありませんテール:スカラ - 地図

def aa(a:Map[String, Seq[Operation]]): Map[String, (Seq[Operation], Double)] = { 

    def aaRec(xx:Map[String, Seq[Operation]], 
       res:Map[String, (Seq[Operation], Double)], 
       acc:Double = 0): Map[String, (Seq[Operation], Double)] = xx match { 
     case ? => 
     res 
     case _ => 
     val head = xx.head 
     val balance = head._2.foldLeft(acc)(_ + _.amount) 
     aaRec(xx.tail, res + (head._1 -> (head._2, balance)), balance) 
    } 

    aaRec(a, Map[String, (Seq[Operation], Double)]()) 

    } 
} 

大文字小文字の大文字と小文字のh @ tの正しい構文は何ですか?

感謝の事前

答えて

3

に私はそれが地図上パターンマッチすることができますかどうかわからないんだけど、このコードは、基本的なコンビネータ方法を使用して書き換えることができます

def aa(a:Map[String, Seq[Operation]]): Map[String, (Seq[Operation], Double)] = 
    a.mapValues(seq => (seq, seq.map(_.amount).sum)) 
+0

通常の警告:あなたは複数回同じキー、たびに計算されます.sum' 'seq.map(。_量)にアクセスするので、もし' mapValues'は、ビューを返します。 –

6

Mapはそう何の秩序を持っていませんheadまたはtailがありません。 unapply/unapplySeqメソッドもありませんので、Mapでパターンマッチングを行うことはできません。

は、私はあなたの最良の選択肢かもしれませんfoldLeftと一緒に行くと思います。