加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中依赖类型的隐式解析

发布时间:2020-12-16 18:09:49 所属栏目:安全 来源:网络整理
导读:考虑以下代码: trait Foo { type T def value: T}object Foo { def apply[A](v: A): Foo = new Foo { override type T = A override def value = v }}trait Decode[A] { def apply(x: A): String}object Decode { def apply[A](f: A = String): Decode[A] =
考虑以下代码:

trait Foo {
  type T
  def value: T
}

object Foo {
  def apply[A](v: A): Foo = new Foo {
    override type T = A
    override def value = v
  }
}

trait Decode[A] {
  def apply(x: A): String
}

object Decode {
  def apply[A](f: A => String): Decode[A] = new Decode[A] {
    override def apply(x: A) = f(x)
  }

  implicit val decodeStr: Decode[String] = Decode(identity)
}

class Sandbox {
  def decodeFoo(foo: Foo)(implicit decoder: Decode[foo.T]): String =
    decoder(foo.value)

  val foo = Foo("hello")
  println(decodeFoo(foo))
}

上面的代码应该工作正常并打印你好,但它无法编译:

could not find implicit value for parameter decoder: Decode[Sandbox.this.foo.T]
[error]   println(decodeFoo(foo))

即使我明确传入隐式参数:

println(decodeFoo(foo = foo)(decoder = Decode.decodeStr))

我现在仍然收到此错误:

type mismatch;
[error]  found   : Decode[String]
[error]  required: Decode[Sandbox.this.foo.T]
[error]   println(decodeFoo(foo = foo)(decoder = Decode.decodeStr))
[error]                                                 ^

当然,我可以让Foo成为Foo [T]并为它定义解码器,但这不是这个问题的重点 – 我想理解为什么上面的代码无法编译.

解决方法

这里存在的问题是:

object Foo {
  def apply[A](v: A): Foo = new Foo {
    override type T = A
    override def value = v
  }
}

在那里,你已经确定你将返回一个Foo但不是,特别是,哪个Foo.因此,该函数只知道它可以返回任何类型T的Foo.你需要一个Aux模式来重新获得在建立你的新Foo时丢失的类型(是的,是的……)

object Foo {
  type Aux[A] = Foo{ type T = A }

  def apply[A](v: A): Aux[A] = new Foo {
    type T = A
    def value = v
  }
}

然后说对于给定的A产生Foo,它的T依赖类型设置为A.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读