0

我正在使用scala-2.8.1scalaz-5.0。谁能准确解释为什么PartialApply1Of2在一种情况下可以推断出 a 在另一种情况下不能推断?

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

即使(如前所述!)该方法<|*|>具有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 错误,而不是合理的错误消息

4

1 回答 1

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、折叠、Type Lambas),以隐藏一些语法混乱

于 2010-12-26T09:15:37.147 回答