2016-11-09 11 views
4

mapfilterをどうにかしてviewSeqに変換するように見えます。Scala `view`:` force`は `Seq`のメ​​ンバではありません

> (v.view map (_ + 1) map (_ * 2)).force 
res12: Seq[Int] = Vector(4, 6, 8, 10, 12, 14, 16, 18, 20, 22) 

しかし、私は似た何かをする場合、私はエラーを取得する:documentationは、この例が含まれてい

> val a = Array(1,2,3) 
> s.view.map(_ + 1).map(_ + 1).force 
<console>:67: error: value force is not a member of Seq[Int] 

それはSeqViewSeqなるとよりもし私mapviewArrayをより詳細ようです。

> a.view.map(_+1) 
res212: scala.collection.SeqView[Int,Array[Int]] = SeqViewM(...) 
> a.view.map(_+1).map(_+1) 
res211: Seq[Int] = SeqViewMM(...) 

私はListVectorと、この動作を複製することはできません、この動作は、Arrayが可変のコレクションであることとは何かを持っていることが疑われます。しかし、filterArrayview私は好きなだけ何度でもできます。

+0

私のIDEはこれを正しく入力するため、REPLのバグのようです。これについてより多くのフィードバックを得ることができれば、おそらくあなたはバグを提出するべきです。 – tkroman

+0

スカラのIDEを使用する 'a.view.map(_ + 1).map(_ + 1).force'を実行しようとしたときと同じエラーが発生する – Shastick

+0

しかし、' .asInstanceOf [SeqView [Int、配列[Int]]]。force'をそれに不平を言うことなく。 – Shastick

答えて

2

Proチップ:reifyからreflectへの暗黙のデバッグは、あなたの友人です。デザインによって

scala> import reflect.runtime.universe.reify 
scala> import collection.mutable._ // To clean up reified exprs 
scala> reify(a.view.map(_ + 1).map(_ * 2)) 
Expr[Seq[Int]](Predef.intArrayOps($read.a).view.map(((x$1) => x$1.$plus(1)))(IndexedSeqView.arrCanBuildFrom).map(((x$2) => x$2.$times(2)))(Seq.canBuildFrom)) 

IndexedSeqView.arrCanBuildFromは別のIndexedSeqViewはない生成されますが、昔ながらのSeqView。しかし、それ以来、あなたはSeqViewが残っていると思います。これを実現するには、に渡されたCBFSeqView.canBuildFromである必要がありますが、何らかの理由でSeqから取得しています。問題がわかったので、SeqView.canBuildFromを手動で渡してエラーを分析しましょう。

これは暗黙の解決やコンパイラなどのバグではありません。コンパイラは私たちにここで失敗する正当な理由を与えることができるので、それは不具合のライブラリです。

scalacCBFへの第二のタイプのparamはここIntまたはそのスーパータイプであることが必要であり、我々はそれを与える1は、任意のAがかかるため、我々は良いです。第3のものは不明であるので、それはまた良いものでもあり得る。したがって、問題は最初です。

scala> implicitly[collection.SeqView[Int, _] <:< collection.TraversableView[_, _]] 
<function1> 

これにより、問題がArray[Int] <: Traversable[_]に絞り込まれます。そしてそれがあります。 ArrayTraversableではありません。したがって、ここで失敗し、Seq秒にCBFで強制的にSeqになります。

SeqViewには、arrCanBuildFromIndexedSeqViewなど)が必要です。これはライブラリのバグです。これはArrayが変更可能であることには関係しません。実際にはArrayはコレクションではありません(Traversableが実装されていないため)。

関連する問題