gpt4 book ai didi

存在类型和类型成员的 Scala 类型推断

转载 作者:行者123 更新时间:2023-12-04 08:24:31 25 4
gpt4 key购买 nike

以下代码无法编译:

trait A[F] {
def find(x: Int): F
def fill(f: F): Unit
}

object TestA {
def test[T <: A[F] forSome { type F }](t: T) =
t.fill(t.find(0))
}

它返回以下编译错误:
test.scala:8: error: type mismatch;
found : (some other)F(in type T)
required: F(in type T)
t.fill(t.find(0))
^

但是,以下代码符合要求:
trait B[F] {
type R = F
def find(x: Int): R
def fill(f: R): Unit
}

object TestB {
def test[T <: B[F] forSome { type F }](t: T) =
t.fill(t.find(0))
}

我在这里有两个问题:
  • 我希望第一段代码能够编译。为什么不呢?
  • 如果第一段代码没有编译有充分的理由,我希望第二段代码也不会编译,出于同样的原因。那么如何编译成功呢?

  • 这其中有一个是错误吗?

    最佳答案

    我不知道为什么编译器会区分这两段代码。基本上,代码无法编译,因为 find 返回的类型以及 fill 期望的类型不必相同 F ,至少如果 findfill在两个不同的对象上调用。

    您可以制作要编译的第一段代码:

    def test[T <: A[F], F](t: T) =
    t.fill(t.find(0))

    你可以让第二段代码不编译:
    def test[T <: B[F] forSome { type F }](t: T, u: T) =
    t.fill(u.find(0))

    这应该是评论而不是答案,但我还没有 50 声望。

    关于存在类型和类型成员的 Scala 类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28649279/

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