gpt4 book ai didi

scala - Scala 中依赖类型的隐式解析

转载 作者:行者123 更新时间:2023-12-05 00:49:40 25 4
gpt4 key购买 nike

考虑以下代码:

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))
}

上面的代码应该可以正常工作并打印 hello但它无法编译:
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 .因此,该函数只知道它可以返回 Foo适用于任何类型 T .您需要一个 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 .

关于scala - Scala 中依赖类型的隐式解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47141486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com