这是一个简单的代码:
import cats.syntax.either._
type FailFast[A] = Either[List[String], A]
def f1:Either[Throwable, String] = Right("test")
def f2:FailFast[String] =
f1.bimap(t => List(t.getMessage), s => s)
def f3:ReaderT[FailFast, Int, String] =
ReaderT(ignored =>
f1.bimap(t => List(t.getMessage), s => s)
)
它已使用Maven成功编译:
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>${scala-maven-plugin.version}</version>
<executions>
<execution>
<id>compile</id>
<phase>process-resources</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<args>
<!--https://tpolecat.github.io/2017/04/25/scalac-flags.html-->
<arg>-Ypartial-unification</arg> <!--configure it also in IDE-->
<!--I also highly recommend -Ywarn-value-discard especially once (if) you start using fully pure code with IO instead of Future-->
<!--<arg>-Ywarn-value-discard</arg>-->
<!--<arg>-Xprint:typer</arg>-->
<arg>-encoding</arg>
<arg>${project.build.sourceEncoding}</arg>
</args>
</configuration>
</execution>
<execution>
<id>test-compile</id>
<phase>process-test-resources</phase>
<goals>
<goal>testCompile</goal>
</goals>
<configuration>
<args>
<!--https://tpolecat.github.io/2017/04/25/scalac-flags.html-->
<arg>-Ypartial-unification</arg> <!--configure it also in IDE-->
<!--I also highly recommend -Ywarn-value-discard especially once (if) you start using fully pure code with IO instead of Future-->
<!--<arg>-Ywarn-value-discard</arg>-->
<!--<arg>-Xprint:typer</arg>-->
<arg>-encoding</arg>
<arg>${project.build.sourceEncoding}</arg>
</args>
</configuration>
</execution>
</executions>
<configuration>
<args>
<arg>-encoding</arg>
<arg>${project.build.sourceEncoding}</arg>
</args>
<displayCmd>true</displayCmd>
</configuration>
</plugin>
并且还可以使用IntelliJ IDEA中的Scala编译器很好地进行编译。
同时,功能f3
被标记为红色,并带有警告:
在同一IntelliJ IDEA中,还有另一个scala项目,该项目也是使用Maven构建的。在该项目中,这是一个编译错误。我现在开始:
错误:(129,5)没有方法的类型参数适用:(运行:A => 存在对象Kleisli中的F [B])cats.data.Kleisli [F,A,B],以便它可以 应用于参数(SomeType => Either [List [String],Double])--- 因为---参数表达式的类型与形式不兼容 参数类型;找到:s =>需要[List [String],Double]: ?A =>?F [?B] ReaderT(s =>
我已经很可能遇到相同的错误,并且通过应用-Ypartial-unification
选项已将其修复。但现在它无济于事。非常奇怪的行为。
如何在第一个示例中消除警告?又如何再次重置-Ypartial-unification
选项?
编辑: 创建了一个问题[https://youtrack.jetbrains.com/issue/SCL-15159]
解决了编译问题。当您打开Scala编译器时,默认情况下会选择一个“默认”项目。不知道那是什么看来这是一个由IntelliJ IDEA本身创建的项目,在我看来,这只是maven项目的包装。因此,如果您手动选择项目(在我的情况下,该项目在“ Maven 1”下列出),您将看到Scala编译器选项不是从“默认”继承的。一旦设置Ypartial-unification
,它就会被编译。只有警告仍然存在。