我知道这个问题是深层次编程,而我的失败是由于缺乏知识。但我想知道至少如何编译这个。我需要编译器来确定我的tuple2在上下文中可以是更高级的类型。
trait Extract[T[_],A]{
def extract(t: T[A]): A
}
object Extract{
type T2[B] = {type l[X] = (X,B)}
implicit def forTuple2[A,B] = new Extract[T2[B]#l,A] {
override def extract(t: (A, B)): A = t._1
}
}
def method[T[_],A](a: T[A])(implicit extractor: Extract[T,A]): A = extractor.extract(a)
method[Extract.T2[String]#l,Int]((1,"hi")) //this works but is useless.
//the whole point is to get the compiler to do the heavy lifting And in
//this case it means inferring that a tuple2 of (X,whatever) is a T[X] for the context
任何尽可能接近我的目标的人都会受到赞赏。我也知道shapeless有一个专门用于这个东西的库。但我们假设没有形状来解决我的问题。
答案 0 :(得分:2)
编译器无法知道您是否需要type T[X] = Tuple2[X, A]
或T[X] = Tuple2[X, A]
,因此即使在查看隐式参数之前它也会放弃。你是一个隐含的正确的轨道,除了在这种情况下你甚至不需要通过一个类型lambda(你没有看到Tuple2[_, A]
为T[A]
):
def method[X, A](x: X)(implicit ev: Open[X, A]): A =
ev.open(x)
Open
指定您要使用的Tuple2
的哪个洞:
trait Open[X, Out] {
def open(x: X): Out
}
object Open {
implicit def firsthole[A, B] = new Open[Tuple2[A, B], A] {
def open(x: Tuple2[A, B]) = x._1
}
}
我知道这个问题是深层次编程
深?你还没有看到任何东西(͡°͜ʖ͡°)