为什么编译器不推断依赖类型?

问题描述 投票:2回答:1

我正在学习无形,并且对依赖类型有一些误解。这是示例:

object App {
  trait Converter[A]{
    type Output
    def convert(a: A): Output
  }

  implicit def toStringConverter[A]: Converter[A] = new Converter[A] {
    override type Output = String
    override def convert(a: A): String = s"Converted value = ${a.toString}"
  }

  def getConvertedValue[A](a: A)(implicit converter: Converter[A]) = converter.convert(a)


  def main(args : Array[String]) {
    val someValue: String = getConvertedValue(new Object) //compiler error, type mismatch
    val someValue2 = getConvertedValue(new Object)        //fine
    println(someValue2) //prints the expected value
  }
}

我不了解第一种情况下的编译错误。编译器正确找到具有implicit def toStringConverter[A]override type Output = String的隐式值。因此,它具有推断返回类型String的所有信息。

为什么不编译?有没有一种方法可以在不参数化输出类型的情况下将返回类型推断为String

scala functional-programming shapeless dependent-type type-level-computation
1个回答
0
投票

您可以通过为toStringConverter指定更精确的返回类型来做到这一点:

implicit def toStringConverter[A]: Converter[A] { type Output = String } = new Converter[A] { ... }

或者根本不指定它,因此可以推断出上述类型,但是不建议将其用于隐式。

© www.soinside.com 2019 - 2024. All rights reserved.