Intellij 的 Scala 类型推断与 REPL 不同

Intellij's Scala type inference differs from REPL

我正在考虑在我的项目中使用 cats 库来使用 Either 列表中的 traverse/sequence 功能。然而,在 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.

显然,这个问题已由 Jetbrains 解决。我已经检查了 Scala 插件 here 的夜间构建 2.2.40,现在 Intellij 在上述情况下推断出与 REPL 相同的类型。 Jetbrains 干得好,而且这么快!

P.S。如果您想尝试一下,请将夜间存储库添加到您的插件存储库列表并检查更新。它位于 Settings -> Plugins -> Browse repositories... -> Manage repositories...,然后添加 Scala 插件夜间存储库:https://plugins.jetbrains.com/plugins/nightly/1347.