gpt4 book ai didi

scala - Scala 中具有 F 界类型和存在类型的编译问题

转载 作者:行者123 更新时间:2023-12-04 23:38:58 25 4
gpt4 key购买 nike

我正在使用 F 有界类型以便能够返回当前类型

trait Board[T <: Board[T]] {
def updated : T
}

我正在尝试编写一个使用它的通用辅助方法。

问题是:为什么下面的不编译?

object BoardOps {
def updated(board: Board[_]) = {
board.updated.updated
}
}

错误是value updated is not a member of _$1

我已经找到了这 2 个解决方法。它们等价吗?

object BoardOps {
def updated(board: Board[_<:Board[_]]) = {
board.updated.updated
}
}

object BoardOps {
def updated[T <: Board[T]](board: T) : T = {
board.updated.updated
}
}

最佳答案

why the following do not compile?

使用 Board[_] 作为参数类型告诉编译器“我不关心 board 内的参数类型”。也就是说,对于编译器来说,this 是一种存在类型,它不知道有关该类型的任何细节。因此,board.updated 返回一个“不可说的”或不透明 类型,因为我们告诉编译器“丢弃”该类型信息。

I've figured out these 2 workarounds. Are they equivalent?

您之前的示例使用了一个存在类型,并限制为 Board[_] 的子类型,或者更正式地说,我们这样写:

Board[T] forSome { type T <: Board[U] }

编译器实际命名为 T -> $_1U -> $_2

同样,我们对内部类型参数一无所知,只知道它在 Board[_] 上有一个上限。您的后一个示例使用名为 T 的通用量化类型,编译器可以使用该类型将方法的返回类型推断为特定类型 T 而不是 任何

要回答您的问题,不,它们不等同。存在类型和普遍量化类型彼此对偶。有关存在主义的更多信息,请访问 What is an existential type?https://www.drmaciver.com/2008/03/existential-types-in-scala/

关于scala - Scala 中具有 F 界类型和存在类型的编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49588729/

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