2016-11-09 5 views
4

mapfilter을 입력하면 viewSeq으로 변환되는 것으로 보입니다.스칼라`view` :`force`는`Seq`의 멤버가 아닙니다

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

하지만 비슷한 할 경우, I 오류 얻을 : :이 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된다 번 I mapviewArray 오버 더 .

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

나는이 문제를 내가 List 또는 Vector로이 동작을 복제 할 수 Array는, 변경 가능한 수집되고 함께 할 수있는 뭔가가있을 수 있습니다 생각한다. 그러나 나는 filterArrayview을 내가 좋아하는만큼 반복 할 수 있습니다.

+0

이상하게도 REPL에 버그가있는 것 같습니다. 내 IDE가 올바르게 입력했기 때문입니다. 이것에 대한 더 많은 피드백을 얻을 수 있다면 아마도 버그를 제기해야 할 것입니다. – tkroman

+0

스칼라 IDE 사용하기 'a.view.map (_ + 1) .map (_ + 1) .force'를 시도 할 때 동일한 오류가 발생합니다. – Shastick

+0

하지만, .asInstanceOf [SeqView [Int, 배열 [Int]]]. force'를 불평하지 말고. – Shastick

답변

2

팁 : REPL에서 암시를 디버깅 할 때 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 또는 그것의 슈퍼 될 필요하고, 우리가 그것을주는 사람이 어떤 A 소요하기 때문에, 우리는 좋은입니다. 세 번째 것은 알려지지 않았기 때문에 무엇이든 상관 없습니다. 따라서 문제는 첫 번째 문제입니다.

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

이렇게하면 문제가 Array[Int] <: Traversable[_]으로 좁아집니다. 그리고 거기에 있습니다. ArrayTraversable이 아니므로 여기에서 실패하고 Seqs가 이되어야합니다.

SeqView에는 arrCanBuildFrom이 있어야합니다 (예 : IndexedSeqView). 이것은 라이브러리의 버그입니다. 이것은 Array이 변경 가능하다는 것과 관련이 없습니다. Array은 실제로 컬렉션이 아니기 때문에 (Traversable을 구현하지 않습니다.)