Scala部分应用了类型构造函数推断

时间:2010-12-24 14:28:26

标签: scala type-inference scalaz

我正在使用 scala-2.8.1 scalaz-5.0 。任何人都可以解释为什么PartialApply1Of2可以在一个案例中被推断而在另一个案例中不会被推断?

scala> 1.success[String] <|*|> "Bah".fail[Int]
res1: scalaz.Validation[String,(Int, Int)] = Failure(Bah)

即使(as has been asked before!),方法<|*|>位于MA上,其中有一个类型参数,而不是两个(Validation有)。我无法在我的IDEA REPL中使用unicode,所以这里是:

object testy {
  def main(args: Array[String]) {
    import scalaz._
    import Scalaz._
    val ps = NonEmptyList(1.success[String], "Bah".fail[Int])

    val res = ps.∘∘((_ : Int) % 2 == 0) //DOES NOT COMPILE
    println(res)
  }
}

我可以为通话提供特定类型,一切都很好。为什么scalac不能推断出这个?

ps.∘∘[PartialApply1Of2[Validation, String]#Apply, Int, Boolean]((_ : Int) % 2 == 0)

在我的REPL中,这实际上会导致scalac错误,而不是合理的错误消息

1 个答案:

答案 0 :(得分:2)

在第一种情况下,推断出隐式视图ValidationMA,并推断出类型参数Int

Scalaz.ValidationMA(1.success[String]).<|*|>[Int]("Bah".fail[Int])

在第二种情况下,在解决#2712之前,无法推断方法∘∘的类型参数。

我怀疑您遇到的scalac内部错误与#2741 / #4079有关。如果是这样,您可以使用Type Lambda重写它以解决错误。

ps.∘∘[({type X[a]=Validation[String, a]})#X, Int, Boolean]((_ : Int) % 2 == 0)

我建议在所有情况下使用此语法而不是PartialApplyNofM,因为我发现它更具可读性。使用最新版本的IntelliJ,您甚至可以将代码折叠(设置,代码样式,Scala,折叠,类型Lambas)启用到hide some syntactic clutter