gpt4 book ai didi

scala - 解释 Scala 类型级编程中使用的 `LowPriorityImplicits` 模式

转载 作者:行者123 更新时间:2023-12-03 02:37:11 25 4
gpt4 key购买 nike

查看一些 Scala 库的源代码时,例如shapeless ,我经常发现名为 LowPriorityImplicits 的特征。

您能解释一下这个模式吗?解决的问题是什么,该模式是如何解决的?

最佳答案

该模式允许您拥有隐式层次结构,避免编译器产生与歧义相关的错误,并提供一种对它们进行优先级排序的方法。作为示例,请考虑以下内容:

trait MyTypeclass[T] { def foo: String }
object MyTypeclass {
implicit def anyCanBeMyTC[T]: MyTypeclass[T] = new MyTypeclass[T] {
val foo = "any"
}

implicit def specialForString[T](implicit ev: T <:< String): MyTypeclass[T] = new MyTypeclass[T] {
val foo = "string"
}
}

println(implicitly[MyTypeclass[Int]].foo) // Prints "any"
println(implicitly[MyTypeclass[Boolean]].foo) // Prints "any"
println(implicitly[MyTypeclass[String]].foo) // Compilation error

最后一行出现的错误是:

<console>:25: error: ambiguous implicit values:
both method anyCanBeMyTC in object MyTypeclass of type [T]=> MyTypeclass[T]
and method specialForString in object MyTypeclass of type [T](implicit ev: <: <[T,String])MyTypeclass[T]
match expected type MyTypeclass[String]
println(implicitly[MyTypeclass[String]].foo)

这不会编译,因为隐式解析会发现歧义;在这种情况下,它有点人为,因为我们使用隐式证据定义 String 情况,以便在我们可以将其定义为 implicit defspecialForString: MyTypeclass[String 时触发歧义。 ] = ... 并且没有任何歧义。但有些情况下,在定义隐式实例时需要依赖其他隐式参数,并使用低优先级模式,您可以按如下方式编写并使其正常工作:

trait MyTypeclass[T] { def foo: String }

trait LowPriorityInstances {
implicit def anyCanBeMyTC[T]: MyTypeclass[T] = new MyTypeclass[T] {
val foo = "any"
}
}

object MyTypeclass extends LowPriorityInstances {
implicit def specialForString[T](implicit ev: T <:< String): MyTypeclass[T] = new MyTypeclass[T] {
val foo = "string"
}
}

println(implicitly[MyTypeclass[Int]].foo) // Prints "any"
println(implicitly[MyTypeclass[Boolean]].foo) // Prints "any"
println(implicitly[MyTypeclass[String]].foo) // Prints "string"

还值得注意的是,此模式不限于两层,但您可以创建特征层次结构,并在其中包含隐式定义,这些定义沿着继承树从更具体到更通用。

关于scala - 解释 Scala 类型级编程中使用的 `LowPriorityImplicits` 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33544212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com