使用lambdas类型混合隐式解决方案

时间:2017-06-11 20:49:26

标签: scala implicit-conversion implicits

我知道这个问题是深层次编程,而我的失败是由于缺乏知识。但我想知道至少如何编译这个。我需要编译器来确定我的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有一个专门用于这个东西的库。但我们假设没有形状来解决我的问题。

1 个答案:

答案 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
  }
}
  

我知道这个问题是深层次编程

深?你还没有看到任何东西(͡°͜ʖ͡°)