2017-02-02 11 views
0
type Occurrences = List[(Char, Int)] 

val lard = List(('a', 1), ('d', 1), ('l', 1), ('r', 1)) 
val r = List(('r', 1)) 


def subtract2(x: Occurrences, y: Occurrences): Occurrences = 
    x.foldLeft(List[(Char, Int)]())({case (acc, list) if(!(y.contains(list))) => acc.::(list)}) 

subtract2(lard, r) 

match.errorの理由は何ですか?

scala.MatchError: (List(),(a,1)) (of class scala.Tuple2) 
at forcomp.A$A183$A$A183$$anonfun$subtract2$1.apply(temp.sc:11) 
at forcomp.A$A183$A$A183$$anonfun$subtract2$1.apply(temp.sc:11) 
at scala.collection.LinearSeqOptimized$class.foldLeft(temp.sc:120) 
at scala.collection.immutable.List.foldLeft(temp.sc:80) 
at forcomp.A$A183$A$A183.subtract2(temp.sc:11) 
at #worksheet#.#worksheet#(temp.sc:14) 

いただきました。このエラーの理由を投げ?私はすべての問題が短所であることを、仮定が、より正確に、私は

答えて

6

MatchErrorがスローされます試してみてください分かりません。

通常、foldLeftは、完全に定義された関数を期待していて、それを与えるのはpartially definedです。 (y.contains場合

  1. 場合(ACC、リスト)((y.contains(リスト)の場合)
  2. 場合(ACC、リスト):!このシナリオでは左を折るためにあなたの引数は、2例が必要ですあなたはすべてのケースをカバーしていないので(リスト))
-1

は、オブジェクトがパターンマッチング表現のいずれかのパターンに一致しないときには、この

val lard = List(('a', 1), ('d', 1), ('l', 1), ('r', 1)) 
val r = List(('r', 1)) 
lard diff r 
+1

をあなたの答えは、技術的な問題(差分を取得)を解いたが(マッチが失敗した理由)質問に答えていません。それでも私は人々が答えを奨励し、投票しようとしていないと思うので+1します –

4

あなたはマッチエラーが発生します(つまり、ときy.contains(リスト))

def subtract2(x: Occurrences, y: Occurrences): Occurrences = 
    x.foldLeft(List[(Char, Int)]()) ({ 
    case (acc, list) if !(y.contains(list)) => acc.::(list) 
    case (acc,list) => acc}) 
+0

なぜ2回マッチするのですか? 'x.foldLeft [Occurrences](List.empty){(acc、pair)=> if(yにペアが含まれている場合)acc else else pair :: acc}' – Jubobs

-1

私はあなたが指定されていませんでしたので、それはだと思います残りの部分はfoldLeftの方法で始まりますstart要素とrestを指定すると、空のリストList()が常に追加され、パターンマッチングに失敗します(エラーログ(List(),(a,1))と同様)。別のマッチングシナリオを追加すると、MatchErrorは解決されますが、想像した結果と異なる結果が生じる可能性があります。

はそのような何か試してみてください:

def subtract2(x: Occurrences, y: Occurrences): Occurrences = 
    x.foldLeft(List[(Char, Int)]){ (start, rest) => 
    start match { 
     case (acc, list) => if !(y.contains(list)) => acc.::(rest) 
     case _   => handle_other_cases_here 
    } 
    } 
関連する問題