我正在使用 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错误,而不是合理的错误消息
答案 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。