Scala 3.3.3导入cats.kernel.laws.IsEq报错:laws非cats.kernel成员
解决导入
cats.kernel.laws.IsEq时的"laws is not a member of cats.kernel"错误 问题原因
- 依赖作用域限制:你在
build.sbt中将cats-laws依赖标记为% Test,这意味着该依赖仅在测试代码目录(src/test/scala)下可见,而你的IsEq引用写在主代码(src/main/scala)中,编译时自然找不到该类。 - 包名冲突风险:代码使用
package scala作为包名,会与Scala标准库的根包名冲突,可能引发隐藏问题。
解决方案
推荐方案(符合Cats设计意图)
Cats的laws组件专为测试场景设计,建议将用到IsEq的代码移到测试目录:
- 将包含
myIsEq的代码文件移动到项目的src/test/scala目录下。 - 保持
build.sbt中的cats-laws依赖配置不变(保留% Test)。 - 修改包名为自定义名称(比如
com.example.checkall),避免与标准库冲突。
备选方案(不推荐,仅用于特殊场景)
如果必须在主代码中使用IsEq,需调整cats-laws的依赖作用域:
修改build.sbt中的依赖配置,移除% Test:
"org.typelevel" %% "cats-laws" % "2.9.0"
同时记得修改冲突的包名。
修改后的测试代码示例
package com.example.checkall import cats.* import cats.kernel.laws.IsEq import cats.kernel.instances.int.* class EqualitySpec extends munit.FunSuite { test("test integer equality") { val a = 42 val b = 42 val isEqual: IsEq[Int] = IsEq(a, b) assert(isEqual.lhs == isEqual.rhs) } }
内容的提问来源于stack exchange,提问作者Ali Tc
相关产品推荐
相关产品推荐

