gpt4 book ai didi

扩展更高种类类型时的 Scala 类型参数与类型字段

转载 作者:行者123 更新时间:2023-12-01 07:05:50 25 4
gpt4 key购买 nike

我认为类型字段是一种更强大的类型参数语法,但我遇到了一个例子,我可以通过后者而不是前者来表达我的意图。问题是 trait A 可以编译,而 trait B 不能编译。

trait Box[T]

trait A[T] extends (Box[T] => Box[T]) {
override def apply(box: Box[T]): Box[T] = identity(box)
}

trait B extends (Box[T] => Box[T]) {
type T
override def apply(box: Box[T]): Box[T] = identity(box)
}

有没有办法像 B 一样使用类型字段来表达 A 中表达的内容?

编辑:错误信息:

not found: type T
trait B extends (Box[T] => Box[T]) {
not found: type T
trait B extends (Box[T] => Box[T]) {

最佳答案

override在当前代码中无用,必要时重新添加。

使用 abstract type member将创建具体类型以使用占位符语法作为参数传递。

trait Box[T]

trait A[T] extends (Box[T] => Box[T]) {
def apply(box: Box[T]): Box[T] = identity(box)
}

对于 B , 使用 type成员 T 与 Box[T] => Box[T]将:

  • 强制扩展类以遵守类型绑定(bind)。

  • 创建一个具体类型作为参数传递

    trait B extends (Box[_] => Box[_]) {
    type T <: (Box[T] => Box[T])
    def apply(box: Box[T]): Box[T] = identity(box)
    }

编译器告诉你它找不到 type T传递给 type constructor .在B的情况下,你试图在定义它之前传递它。

higherKind占位符语法将传递内部 type Ttype constructor .

This将是一本好书。

关于扩展更高种类类型时的 Scala 类型参数与类型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19812370/

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