【问题标题】:Scala partially applied type constructor inferenceScala 部分应用类型构造函数推断
【发布时间】:2010-12-24 14:28:26
【问题描述】:

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

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

即使 (as has been asked before!) 方法 &lt;|*|&gt; 位于 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 错误,而不是合理的错误消息

【问题讨论】:

    标签: scala type-inference scalaz


    【解决方案1】:

    在第一种情况下,隐式视图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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-22
      • 2019-09-23
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多