Scala 混合隐式解析和lambdas类型
我知道这个问题是深层编程,我的失败是因为缺乏知识。但我想知道至少如何编译这个。我需要编译器来确定我的tuple2在上下文中可以是更高级的类型Scala 混合隐式解析和lambdas类型,scala,implicit-conversion,implicits,Scala,Implicit Conversion,Implicits,我知道这个问题是深层编程,我的失败是因为缺乏知识。但我想知道至少如何编译这个。我需要编译器来确定我的tuple2在上下文中可以是更高级的类型 trait Extract[T[\uu],A]{ def提取物(t:t[A]):A } 对象提取{ T2型[B]={l型[X]=(X,B)} 隐式def四元组2[A,B]=新提取[T2[B]#l,A]{ 覆盖def提取(t:(A,B)):A=t.\u 1 } } def method[T[_],A](A:T[A])(隐式提取器:Extract[T,A]):
trait Extract[T[\uu],A]{
def提取物(t:t[A]):A
}
对象提取{
T2型[B]={l型[X]=(X,B)}
隐式def四元组2[A,B]=新提取[T2[B]#l,A]{
覆盖def提取(t:(A,B)):A=t.\u 1
}
}
def method[T[_],A](A:T[A])(隐式提取器:Extract[T,A]):A=extractor.Extract(A)
方法[Extract.T2[String]#l,Int]((1,“hi”)//此方法有效,但没有用。
//关键是让编译器完成繁重的工作,并在
//这种情况意味着推断(X,whatever)的tuple2是上下文的T[X]
任何尽可能接近我的目标的东西都会受到赞赏。我也知道Shapless有一个专门的图书馆。但是让我们假设不存在shapeless来解决我的问题 编译器无法知道您是想要
类型T[X]=Tuple2[X,A]
还是T[X]=Tuple2[X,A]
,因此它甚至在查看隐式参数之前就放弃了。您使用隐式的方法是正确的,除了在本例中,您甚至不需要使用lambda类型(您不需要将Tuple2[\uu,a]
视为t[a]
):
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
}
}
我知道这个问题是深层编程 深?你什么都没看见(°你什么都没看见(°你什么都没看见(°你什么都没看见),“现在让我担心的是……)
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
}
}