繁体   English   中英

在scala中有条件地生成隐式

[英]Conditionally generating implicits in scala

我正在研究一个链接的隐式函数系统,该系统类似于下面的简化示例。 测试c1.payload == c2.payload表示我需要执行的测试不在“类型空间”中; 我曾期望我可以进入witnessEvidence定义的witnessEvidence ,但是Scala显然不允许使用带有任意类型的隐式参数的宏定义(仅WeakTypeTag值!),因此我对如何进行此操作感到有些困惑。 下面的代码从逻辑上显示了我想要发生的事情,但是隐式函数不能有条件地产生或不产生证据(除非它在宏实现中)。

case class Capsule[T](payload: Int)

trait A
trait B
trait C

implicit val capa = Capsule[A](3)
implicit val capb = Capsule[B](3)
implicit val capc = Capsule[C](7)

case class Evidence[T1, T2](e: Int)

implicit def witnessEvidence[T1, T2](implicit c1: Capsule[T1], c2: Capsule[T2]): Evidence[T1, T2] = {
  if (c1.payload == c2.payload)
    Evidence[T1, T2](c1.payload)
  else
    // Do not produce the evidence
}

def foo[T1, T2](implicit ev: Evidence[T1, T2]) = ev.e

val f1 = foo[A, B] // this should compile
val f2 = foo[A, C] // this should fail with missing implicit!

这是不可能的,因为隐式解析是在编译时完成的,而值等效性的测试是在运行时完成的。

要使此工作有效,您需要使编译器将值理解为类型,以便可以要求两个3的类型相等,并使用其推断capa =:= capb。 为此,您可以使用单例类型: https : //github.com/milessabin/shapeless/wiki/Feature-overview : -shapeless- 2.0.0#singleton-typed- literals

如果您需要进行除纯等式比较之外的算术运算,则需要使用Nathttps : //github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/nat.scala

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM