scala - 스칼라 implicit




스칼라 뷰 애플리케이션 애호가 (4)

다음과 같은 두 가지 특징이 있다고 가정 해보십시오.

trait Foo[A] { def howMany(xs: List[A]) = xs.size }
trait Bar

그리고 두 번째에서 첫 번째 암시 적 변환 :

implicit def bar2foo[A](bar: Bar) = new Foo[A] {}

Bar 와 정수 목록을 만듭니다.

val bar = new Bar {}
val stuff = List(1, 2, 3)

이제 다음과 같이 작동 할 것으로 기대됩니다.

bar howMany stuff

그러나 그렇지 않습니다.

scala> bar howMany stuff
<console>:13: error: type mismatch;
 found   : List[Int]
 required: List[A]
              bar howMany stuff
                          ^

그래서 우리 는 spec (이것은 굵은 글씨로 강조 함)을 말합니다.

뷰는 세 가지 상황에 적용됩니다.

  1. [여기에는 관련이 없습니다.]

  2. T 타입의 e 를 가진 선택 안에 , 선택자 mT 의 멤버를 나타내지 않는다면 . 이 경우, e에 적용 할 수 있고 결과에 m 이라는 구성원이 포함 된보기 v 가 검색됩니다. 암시 적 범위가 T 중 하나 인 암시 적 매개 변수의 경우와 같이 검색이 진행됩니다. 그러한 뷰가 발견되면 선택 emv (e) .m 로 변환됩니다.

  3. 선택자 mT 의 일부 구성원을 나타내지 만 이들 구성원 중 어느 것도 인수 args에 적용 할 수없는 경우 T 유형의 e 를 갖는 선택 em (args) 에서. 이 경우 e에 적용 할 수있는 뷰 v 가 검색되고 arg에 적용 가능한 메소드 m 이 결과에 포함됩니다. 암시 적 범위가 T 중 하나 인 암시 적 매개 변수의 경우와 같이 검색이 진행됩니다. 그러한보기가 발견되면 선택 사항은 v (e) .m (args) 로 변환됩니다.

그래서 우리는 일하기에 너무 어리석은 일이라고 생각하면서 다음을 시도합니다.

trait Foo[A] { def howMany(xs: List[A]) = xs.size }
trait Bar { def howMany = throw new Exception("I don't do anything!") }

implicit def bar2foo[A](bar: Bar) = new Foo[A] {}

val bar = new Bar {}
val stuff = List(1, 2, 3)

그러나 그것은 (최소한 2.9.2와 2.10.0-RC2에서) :

scala> bar howMany stuff
res0: Int = 3

예를 들어, 이 문제의 해결 방법 과 같이 실제로는 이상한 동작 이 발생 합니다.

나는 세 가지 (밀접하게 관련된) 질문을 가지고있다 :

  1. 위의 원래의 경우에 올바르게 적용된보기를 갖기위한 간단한 방법 (즉, 적절한 이름을 가진 가짜 메소드를 추가하는 것을 포함하지 않는 방법)이 있습니까?
  2. 누군가이 동작을 설명하는 사양을 읽을 수 있습니까?
  3. 이것이 의도 한 행동이라고 가정하면, 전혀 의미가 있지 않습니까?

또한이 문제에 대한 이전 토론에 대한 링크를 제공해 주시면 감사하겠습니다. Google에 많은 행운이 없었습니다.


Foo를 다음으로 바꾸기 :

trait Foo[_] { def howMany(xs: List[_]) = xs.size }

그것은 작동하는데, 그것은 또한 나에게 훨씬 더 의미가 있습니다. 왜냐하면 당신은 A에 절대적으로 관심이 없기 때문입니다.


내 대답은 버그처럼 보입니다.

  1. Scala 컴파일러에 대해보고 된 simliar 버그를 검색합니다. 발견되지 않으면 새로운 버그를보고합니다. https://issues.scala-lang.org/
  2. 스펙의이 부분은 형식 유추에 대해 말하지 않기 때문에이 경우 중요하지 않습니다.
  3. 나에게 어떤 의미가 없다.

추신. 2.8.1에서는 Bar에 더미 메소드를 추가하는 방법으로 컴파일하지 않습니다.


모든 사람의 참조를 위해 이것은 단지 버그 일 수 있습니다. 오류 메시지라는 것을 알 수 있습니다.

<console>:13: error: type mismatch;
 found   : List[Int]
 required: List[A]

List [A]는 실제 유형이 아닙니다. List는 자체 유형 매개 변수에 적용됩니다. 그것은 표현할 수있는 유형이 아니기 때문에 요구 될 수있는 유형이 아닙니다.

[편집 - 너무 일찍, 내가 무슨 말을하는지 알지. 위 내용은 무시하고 링크를 따라갈 수 있습니다.]

관련 티켓은 https://issues.scala-lang.org/browse/SI-6472 입니다.


이것은 추한 동안 작동하는 것처럼 보입니다.

(bar: Foo[Int]) howMany stuff




implicits