Traversable
演算子を使用してScalaで一連のビューを連結しようとfoldLeft
していますが、理解できない型の差異エラーが発生しています。
このようにビューreduce
のリストを連結するために使用できます。Traversable
val xs = List(1,2,3,4).map(Traversable(_).view).reduce((a: TraversableView[Int, Traversable[_]], b: TraversableView[Int, Traversable[_]]) => a ++ b) // TraversableView[Int,Traversable[_]]
// xs.force returns Traversable[Int] = List(1, 2, 3, 4)
reduce
(引数に型注釈を記述しなければならないことに注意してください:reduce(_ ++ _)
コンパイルされません。理由がわかりません。これについても説明していただければ幸いです。)
リストを頭と尾に分割して連結することもできます。
import collection.TraversableView
val ns = List(1,2,3,4)
val h = Traversable(ns.head).view
val t = ns.tail.map(Traversable(_).view).reduce((a: TraversableView[Int, Traversable[_]], b: TraversableView[Int, Traversable[_]]) => a ++ b)
val xs = h ++ t // TraversableView[Int,Traversable[_]]
// xs.force returns Traversable[Int] = List(1, 2, 3, 4)
しかし、同じことをIで行おうとすると、foldLeft
型の差異エラーが発生します。
import collection.TraversableView
val ns = List(1,2,3,4)
val h = Traversable(ns.head).view
val t = ns.tail.map(Traversable(_).view)
val xs = (h /: t)((a: TraversableView[Int, Traversable[_]], b: TraversableView[Int, Traversable[_]]) => a ++ b)
<console>:14: error: type mismatch;
found : scala.collection.TraversableView[Int,Traversable[_]]
required: java.lang.Object with scala.collection.TraversableView[Int,Traversable[Int]]
(h /: t)((a: TraversableView[Int, Traversable[_]], b: TraversableView[Int, Traversable[_]]) => a ++ b)
問題はの実存型に関係していると思いますがTraversable[_]
、私が間違っていることを正確に理解することはできません。上記の式でさまざまな型アノテーションを試しましたが、役に立ちませんでした。Stackoverflowに関する他の質問から判断すると、の入力には注意が必要ですがfoldLeft
、この問題に対処するものは見つかりませんでした。
比較のために、同じアルゴリズムを使用しStream
ても問題なく機能します。
val xs = (1 #:: Stream.empty /: List(2,3,4).map(_ #:: Stream.empty))(_ ++ _)
// xs.force returns Stream[Int] = Stream(1, 2, 3, 4)
上記は私がやりたいことですが、Stream
すべての結果をメモ化する必要がないため、代わりにビューを使用したい場合があります。
これは奇妙な要求のように見えるかもしれません。私がこの方法で物事をやりたい理由foldLeft
は、ビューを実行することで、遅延深さ優先探索Traversable
を実装する効率的な方法が提供されるためです。