다음 코드는 유형 클래스를 정의합니다.타이프 스크립트 및 하위 유형
trait Foo[T] {
def toFoo(x: T): String
}
trait Foos {
def toFoo[T](f: T => String): Foo[T] = new Foo[T] {
def toFoo(x: T): String = f(x)
}
}
object Foo extends Foos {
def toFoo[A: Foo](a: A) = implicitly[Foo[A]].toFoo(a)
implicit def AToFoo: Foo[A] = toFoo { c =>
"A"
}
implicit def BToFoo[T]: Foo[B] = toFoo { c =>
"B"
}
implicit def ListToFoo[T: Foo]: Foo[List[T]] = toFoo { c =>
c.map(toFoo(_)).
}
}
class A
class B extends A
지금 내가 toFoo(List(new A, new B)
을 할 경우 내가 가지고있는 경우에 나는 List("A", "A")
대신 List("A", "B")
얻을. 유형 B
인 클래스의 경우 AToFoo
대신 BtoFoo
메소드가 사용되도록하려면 어떻게해야합니까?
'List (new A, new B)'에 어떤 유형이 있습니까? –
'List (A, new B)'타입이'List [A]' – Stephan
이길 기대합니다.'List [A]'를 통해'toFoo'를 매핑하면 명백히'암시 적으로 [Foo [A]]'를 호출하고'AToFoo' 암시적인 def를 얻고 각 요소에이를 사용합니다. Typeclasses는 가치 지향적 인 파견을위한 것이 아니라 유형 지정 파견을 위해 설계되었으므로 하위 유형 지정과 항상 잘 작동하지는 않습니다. –