gpt4 book ai didi

scala - 类型类和包对象的奇怪隐式解析行为

转载 作者:行者123 更新时间:2023-12-01 05:08:57 25 4
gpt4 key购买 nike

我正在尝试为类型类列表提供不同的实现集,其中导入不同的包对象将为最终用户提供不同版本的 TypeClass实现到范围内,交换完全不可见。

trait TypeClass[T] {
def name: String
}


trait DefaultTypeClasses {
implicit val String: TypeClass[String]
implicit val Int: TypeClass[Int]
}

trait FirstImplementor extends DefaultTypeClasses {
implicit object String extends TypeClass[String] {
def name = "test"
}

implicit object Int extends TypeClass[Int] {
def name = "int"
}
}

object FirstImplementor extends FirstImplementor


object Test {

import FirstImplementor._

def doSomething[T : TypeClass](value: T): Unit = {
println(implicitly[TypeClass[T]].name)
}

doSomething("test")

}

以上按预期工作,但如果这样做:
trait DefaultDefinitions extends DefaultTypeClasses {
}
package object something extends DefaultDefinitions with FirstImplementor {}

然后我导入相同的 package object进入 Test的范围对象,像这样:
import com.blabla.something._ // should bring all type class definitions from FirstImplementor into scope.

object Test {

def doSomething[T : TypeClass](value: T): Unit = {
println(implicitly[TypeClass[T]].name)
}

doSomething("test")// Cannot find implicit value for TypeClass[String]
doSomething[String]("test")(String) // if passed explicitly it compiles as expected, no more imports necessary.
}

无论出于何种原因,物化类型类都可以在显式范围内按名称使用,但不能在隐式范围内使用。听起来我对 SLS 的了解有差距,有人可以澄清一下吗?

最佳答案

但是如果你在包中创建 Implicits 对象,它工作正常。但是我不知道原始错误是 scalac 中的错误还是正确的行为

package object something  {
object Implicits extends DefaultDefinitions with FirstImplementor
}

import something.Implicits._

关于scala - 类型类和包对象的奇怪隐式解析行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26414845/

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