2016-09-22 2 views
2

가 나는 toBarList 기능은 컴파일되지 않습니다이 코드스칼라 Implicits 컴파일 오류

case class Foo(x: Int) 
case class Bar(y: Int) 
object Foo { 
    implicit def toBar(f: Foo) : Bar = { Bar(f.x) } 
    implicit def toBarList(fl: List[Foo]) : List[Bar] = {fl.map{x: Bar => x}} 

을 썼다.

<console>:17: error: type mismatch; 
found : Bar => Bar 
required: Foo => ? 
     implicit def toBarList(fl : List[Foo]) : List[Bar] = { fl.map{x : Bar => x}} 

그러나 여기서 implicits 시스템이 실행되지 않아야합니까? 컴파일러는 함수가 Bar를 기대하지만 Foo를 전달하는 오류가 있음을 감지해야합니다. 이제는 Foo를 Bar로 변환하는 암시 적 함수가 이미 있으므로이를 사용해야하고 모든 것이 작동해야합니다.

왜 이렇게 컴파일되지 않았습니까?

+0

,'{fl.map {X : 바 => B}}', 아마 당신이 의미하는'{fl.map {X : Bar => x}}'또는'{fl.map {b : Bar => b}}'일 수 있습니다. – dveim

답변

2

map 함수 인수를 사용하고 List[Foo]mapFoo에서 기능을 필요로하는 통상의 방법이다. Bar (구체적으로 Bar => Bar)의 함수를 제공했으나 Foo에서 Bar으로의 암시 적 변환을 사용한다고해서 Bar => Bar에서 Foo => Bar (메서드에서 필요한 것) 중에서 하나가 있다는 의미는 아닙니다.

과 유사한 (이것은 당신이 (명시 적 또는 암시 적으로) 변환을 적용 후 Foo에서 기능을 제공해야합니다 중 하나가 작동을하거나 Foo => BarBar => Bar에서 암시 적 변환을 제공해야합니다 List[Foo]에서 List[Bar]까지 제공하려고하지만 전환이 다른 방향에서 발생하는 경우 Function1은 첫 번째 인수에서 반올림하며 List은 공변수이므로 전환이 발생합니다. 첫 조각에서

(이것은하지만, 모든 아주 나쁜 생각입니다.)

+0

용서해주십시오. 컴파일러가 Foo => Bar를 제공했지만 Bar => Bar가 필요하다는 것을 발견했을 때. 왜 Foo to Bar 변환을 암묵적으로 자동으로 찾지 않았습니까? 따라서 컴파일러는 Foo => Bar 변환을 Bar => Bar 변환으로 변환해야합니다. 왜냐하면 Foo => Bar 변환이 범위에 있기 때문입니다. –

+0

@KnowsNotMuch 이유의 핵심은 함수가 특정 클래스의 인스턴스 (일부 특수 구문을 사용하는 경우)라는 것입니다. 이런 점에서 특별한 경우는 없으며'Foo => Bar '가 필요하고'Bar => Bar'가있는 경우'Foo'에서'Bar' 변환은 도움이되지 않습니다 'List [Foo]'가 있고'List [Bar]'가 필요하다면 도움이되지 않습니다. –

관련 문제