복붙노트

[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. ==============================

    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. ==============================

    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]
    }
    
  3. from https://stackoverflow.com/questions/1721356/scala-2-8-canbuildfrom by cc-by-sa and MIT license