[SCALA] 스칼라 2.8 CanBuildFrom
SCALA스칼라 2.8 CanBuildFrom
또 다른 내가 묻는 질문 스칼라 2.8 브레이크 아웃에 이어, 나는 스칼라 방법 TraversableLike에 대한 자세한 조금 이해하고 싶었 [A] .MAP 누구의 서명은 다음과 같다 :
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
이 방법에 대한 몇 가지주의 :
다음과 같이 나는이를 호출 할 수 있습니다 :
> val s: Set[Int] = List("Paris", "London").map(_.length)
s: Set[Int] Set(5,6)
즉, B 바인딩되는 사실은 컴파일러에 의해 시행되고있다 (즉, B의 일부 모음입니다) 어떻게 확실히 이해는 할 수없는 무엇. 유형 매개 변수는 위와 형질 CanBuildFrom 자체의 서명의 서명이 모두 독립적으로 보면 :
trait CanBuildFrom[-From, -Elem, +To]
어떻게 스칼라 컴파일러는 그가 이해가되지 않는 일을 강요 할 수 없음을 보장한다?
> val s: Set[String] = List("Paris", "London").map(_.length) //will not compile
어떻게 컴파일러는 암시 CanBuildFrom 객체가 호출 범위에 무엇을 결정 하는가?
해결법
-
==============================
1.맵에 두 번째 인수는 암시 적 인수입니다 있습니다. 그렇지 않으면, 당신은 이러한 인수를 전달해야하며,이 적절한 유형의 범위 암시, 또는해야합니다.
맵에 두 번째 인수는 암시 적 인수입니다 있습니다. 그렇지 않으면, 당신은 이러한 인수를 전달해야하며,이 적절한 유형의 범위 암시, 또는해야합니다.
당신의 예에서, 그 세트 [문자열] 여야, B는 지능과에 repr 목록 [문자열]해야해야합니다. 즉 컴파일 할 따라서 범위에서 다음과 같은 내장 객체가 필요합니다 :
implicit object X: CanBuildFrom[List[String], Int, Set[String]]
범위 같은 건 없습니다. 그 자체가, 그 첫 번째 유형 모든 클래스 (아무것도의 콘트라 변형 후손)이 될 수있는 암시 CanBuildFrom을 필요로하지만, 그렇지 않으면 다른 유형에 의해 제한 있기 때문에, 브레이크 아웃은, 그것을 제공 할 수 없습니다.
목록의 동반자 개체에서 CanBuildFrom 공장에, 예를 들어 살펴 보자 :
implicit def canBuildFrom [A] : CanBuildFrom[List, A, List[A]]
그것은을 통해 두 번째와 세 번째 매개 변수를 결합하기 때문에, 문제의 암시가 작동하지 않습니다.
그럼, 어떻게 하나는 implicits에 대해 곳을 찾기 위해 알고 있나요? 우선, 스칼라는 모든 범위에 몇 가지를 가져 않습니다. 지금, 나는 다음과 같은 수입을 불러올 수 있습니다 :
import scala.package._ // Package object import scala.Predef._ // Object // import scala.LowPriorityImplicits, class inherited by Predef import scala.runtime._ // Package
우리가 implicits에 대해 우려하고 있기 때문에 당신이 패키지에서 물건을 가져올 때, 참고, 할 수있는 유일한 implicits은 싱글 있음. 당신은 객체 (싱글)에서 물건을 가져 오면, 다른 한편으로는, 당신은 암시 적 정의, 가치, 싱글을 가질 수 있습니다.
지금, 문자열에 관심을 PREDEF 및 LowPriorityImplicits 내부 CanBuildFrom의 implicits이있다. 그들은지도 (_.toInt) "이 문자열입니다"라고 기입 할 수있게.
그래서, 이러한 자동 수입을 금지하고, 당신이 만드는 명시 적 수입은, 다른 어디 암시 BE 찾을 수 있습니까? 한 장소 : 방법이 적용되고있는 인스턴스의 동반자 객체.
나는 동반자 관련 implicits를 포함 할 수 있습니다 문제의 인스턴스의 클래스에서 상속 된 모든 특성 및 클래스의 객체 때문에 동반자, 복수에서 개체 말한다. 인스턴스 자체는 암시를 포함 할 수 있는지 확실하지 않습니다. 나는 확실히 종류 여기에 몇 가지의 실수를 해요 그래서 솔직히 말해서, 나는 지금이 문제를 재현 할 수 있습니다.
어쨌든, 동반자 객체 내부를 들여다 보면.
-
==============================
2.
object ArrayBuffer extends SeqFactory[ArrayBuffer] { /** $genericCanBuildFromInfo */ implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, ArrayBuffer[A]] = new GenericCanBuildFrom[A] def newBuilder[A]: Builder[A, ArrayBuffer[A]] = new ArrayBuffer[A] }
from https://stackoverflow.com/questions/1721356/scala-2-8-canbuildfrom by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 어떻게 스칼라 가변 인자 방법으로 스칼라 배열을 전달하는? (0) | 2019.11.08 |
---|---|
[SCALA] 나는 RDD의 아파치 스파크에서 반복 어떻게 (스칼라) (0) | 2019.11.08 |
[SCALA] 스칼라 함수 리터럴은 무엇인가? (0) | 2019.11.08 |
[SCALA] 무엇 * 너무 *의 경우 클래스 상속 문제? (0) | 2019.11.08 |
[SCALA] <: 스칼라 <연산자 (0) | 2019.11.08 |