Intellij的Scala类型推断与REPL不同

时间:2016-03-11 12:11:08

标签: scala intellij-idea scala-cats

我正在考虑在我的项目中使用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

1 个答案:

答案 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