2016-07-01 9 views
0

私は上の折り畳み操作を適用したい以下の方法している:私は何を得ることはありませんがelemはのタイプはScalaはタプルのシーケンスに折る

def rec(id: String, elems: Seq[(String, MyCase)]) = { 
    elems.fold(Seq.empty[(String, Seq[String])] { elem => 
    .... 
    } 
} 

ですがNothingであると私はしないでくださいなぜそれがすべきか理解する!すべての手がかりは?

+0

を私は[Tuple2](HTTP上で 'fold'機能が表示されていません。 //www.scala-lang.org/api/current/#scala.Tuple2)。 –

+0

「MyCase」の種類は何ですか? – Brian

+0

タイトルが誤解を招いています。 タプルのシーケンスの折り返し。 –

答えて

1

あなたは{前に閉じ括弧が欠落している、それは、理由はあなたのIDE、おそらく、さんのタイプはNothingだと思います。

foldLeftではなく、fold(最初のパラメータはシーケンスの要素のタイプと一致する必要があります)を検索している可能性があります。

Seq[A].foldLeftの(簡体字)の署名がある:

foldLeft[B](b: B)(f: (B,A) => B) 

あなたが見ることができるように、それは最初のパラメータの型にTuple2を変換機能を、取ります。タプルの最初の要素は最初のパラメータと同じ型を持ち、2番目の要素はシーケンスの要素と同じ型です。

あなたの例では、BSeq[(String, Seq[String])]であり、シーケンス要素は(String, MyCase)です。関数への入力の種類は、したがって、このように恐ろしく探しタプルを取る:

(Seq[(String, Seq[String])], (String, MyCase)) 
0

第2編集: 私はばかです。フォールドは、入力タイプと同じ値を返す必要があります。 たとえば、下のすべての折り畳みをfoldLeftsに置き換えれば動作します。 標準の折り畳みでデータ型を変換することはできません。 それは私のためにコンパイルしていましたが、私は戻り値の型が役に立たなかったことに気付かなかった。

倍の2番目のパラメータは関数である。この場合、

(ResultType, SingleElement) => Result Type 

(Seq[(String, Seq[String])], Seq[(String, MyCase)]) => Seq[(String, Seq[String])] 

コンパイラは何それを知らないので、あなたのコードは唯一の二番目のパラメータの1つの入力を持っていますです。だから、それは次のようになります。

elems.foldLeft(Seq.empty[(String, Seq[MyCase])] {(zeroSeq, nextElem) => 
    //zeroSeq: Seq.empty[(String, Seq[MyCase] 
    //nextElem: (String, MyCase) 
} 

EDIT:

は例えば次のようにコンパイル:

case class MyCase(x: String) 
val elems: Seq[(String, MyCase)] = Seq(("Hi", MyCase("B"))) 

elems.foldLeft(Seq.empty[(String, Seq[MyCase])]){(z, s) => 
    z 
} 
+0

Nope!これはコンパイルされません! – sparkr

+0

まだありません! zとsの型は、私が期待しているものと同じです! – sparkr

+0

実際のタイプで適格なzとsを試してください。コンパイルされていないことがわかります! – sparkr

1

これだけfoldにしたいされていない、あなたによって引き起こされ、また、あなたはタプルmapしたい、折り目を参照してくださいメソッドシグネチャ:

def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op) 

入力タイプとOUTTYPEが同じでなければなりません:A1

マップする場合ので、あなたは多分を試してみたいです0:

def foldLeft[B](z: B)(op: (B, A) => B): B = 

Aにバウンディングずに、出力タイプBためのジェネリック医薬品があります。

また、我々はfoldソースコードを見つけることができますが呼んでいる:多分などの

def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op) 

使用foldLeft

elements.fold(Seq.empty[(String, Seq[String])])((a, b) => a ++ Seq((b._1, Seq[String]()))) 
関連する問題