我正在考虑在我的项目中使用cats
库来在Either
列表中使用其遍历/序列功能。但是,在Intellij IDEA中,当我Show type
时,我看到一个完全奇怪的推断类型。同时,如果我将此代码复制并粘贴到sbt console
中,我会得到漂亮而干净的类型。这是一个例子:
scala> :paste
// Entering paste mode (ctrl-D to finish)
import cats._, cats.syntax.traverse._, cats.std.all._
val xs: List[Either[String, Int]] = List(Right(1), Right(2))
val r = xs.sequenceU
// Exiting paste mode, now interpreting.
import cats._
import cats.syntax.traverse._
import cats.std.all._
xs: List[Either[String,Int]] = List(Right(1), Right(2))
r: scala.util.Either[String,List[Int]] = Right(List(1, 2))
如您所见,变量r
的类型很好:Either[String, List[Int]]
。
然而,Intellij推断出以下怪物:
Unapply.Aux2Right[Applicative, Either[String, Int], Either, String, Int]#M[List[Unapply.Aux2Right[Applicative, Either[String, Int], Either, String, Int]#A]]
我不想在我的同事身上看到这种类型的痛苦,甚至是单独理解它,因为它会显着降低我的症状。我已经尝试使用最新的Intellij 16.1 EAP和EAP构建的Scala插件,以及它们的稳定版本,它们都是一样的。
我想,此刻我无能为力,但也许,也许,或许,这有一些解决方法吗?
P.S。这样的事情(即工具支持)减慢了FP的采用速度,至少不低于FP固有的概念复杂性。 :(
P.P.S。 Intellij的跟踪器中的问题是here。
答案 0 :(得分:1)
显然,Jetbrains解决了这个问题。我已经检查了Scala插件here的每晚构建2.2.40,现在Intellij在上述情况下推断出与REPL相同的类型。伟大的Jetbrains,很快!
P.S。如果您想尝试一下,请将夜间存储库添加到您的插件存储库列表并检查更新。它位于<% unless @visits.nil? %>
<% @visits.each do |f| %>
....
<% end %>
<% end %>
- &gt; Settings
- &gt; Plugins
- &gt; Browse repositories...
,然后添加Scala插件每晚存储库:https://plugins.jetbrains.com/plugins/nightly/1347。