《Scala with Cats》示例代码运行.sc脚本报asRight不属于类型参数A错误
报错原因分析
这个错误的核心是.sc脚本的编译/运行逻辑和标准.scala文件存在差异,导致cats.syntax.either._导入的asRight/asLeft扩展方法没有被正确识别,具体有两类常见触发原因:
- IDEA Scala Worksheet 隐式解析逻辑差异:普通
.scala是完整的独立编译单元,编译器会从文件头到尾部完整扫描所有导入、定义,泛型方法内部的隐式作用域会被正确识别。而IDEA默认的Worksheet运行逻辑会把脚本拆分成多个代码段分段求值,泛型类Check[E, A]内部的apply方法在求值时,顶部的cats.syntax.either._导入偶尔会被截断,编译器找不到针对泛型参数A的asRight扩展方法,就会抛出「A没有asRight成员」的错误。 - 脚本依赖加载顺序问题:如果你的
.sc是Ammonite脚本,build.sbt里配置的依赖默认不会自动同步到脚本运行环境,脚本运行时没有加载cats的扩展方法,自然识别不了asRight语法。
解决方案
- 最稳妥的兼容写法:给扩展方法显式指定泛型参数,消除编译器的隐式解析歧义,将对应行修改为:
case (Right(a), Right(_)) => a.asRight[E] case (Right(_), Left(e)) => e.asLeft[A] case (Left(e), Right(_)) => e.asLeft[A] case (Left(e1), Left(e2)) => (e1 |+| e2).asLeft[A] - 如果是IDEA Worksheet场景:打开Worksheet的设置页,勾选「Run worksheet in the process of the module」、「Make project before run」,关闭分段求值逻辑,让整个脚本作为完整编译单元运行,和普通
.scala行为保持一致。 - 如果是Ammonite脚本场景:在脚本最开头加一行显式依赖导入:
import $ivy.`org.typelevel::cats-core:2.1.0`
内容的提问来源于stack exchange,提问作者SkyOne
相关产品推荐
相关产品推荐

