gpt4 book ai didi

scala - Scala 3 中的类型模式匹配和推理错误

转载 作者:行者123 更新时间:2023-12-04 14:56:33 28 4
gpt4 key购买 nike

我在 Scala 3 中使用类型类,遇到了一个我无法解释的编译错误。

考虑以下代码:

trait Transformation[Input, Output <: Tuple]:
def apply(x: Input): Output


trait ListOfTransformations[T[_, _] <: Transformation[_, _], Input <: Tuple, Output <: Tuple] extends Transformation[Input, Output]

object ListOfTransformations:
given empty[T[_, _] <: Transformation[_, _]]: ListOfTransformations[T, EmptyTuple, EmptyTuple] with
def apply(t: EmptyTuple): EmptyTuple = t

given nonEmpty[T[_, _] <: Transformation[_, _], Head, Tail <: Tuple, HeadOutput <: Tuple, TailOutput <: Tuple](
using
ht: T[Head, HeadOutput],
tt: ListOfTransformations[T, Tail, TailOutput]
): Transformation[Head *: Tail, Tuple.Concat[HeadOutput, TailOutput]] with
def apply(x: Head *: Tail): Tuple.Concat[HeadOutput, TailOutput] = ht(x.head) ++ tt(x.tail)

我得到:

Found:    Tuple.Head[Head² *: Tail]
Required: nonEmpty.this.ht.Input

where: Head is a type in object Tuple which is an alias of [X <: NonEmptyTuple] =>>
X match {
case [x, _ <: Tuple] =>> scala.runtime.MatchCase[x *: _, x]
}
Head² is a type in class nonEmpty
Tail is a type in class nonEmpty with bounds <: Tuple

我错过了什么?

最佳答案

当使用带边界的类型构造函数作为类型参数时,请确保使用实际参数而不是通配符。使用 T[a, b] <: Transformation[a, b]而不是 T[_, _] <: Transformation[_, _]让它编译( Scastie )。前者采用类型构造函数,当给定两个类型时,给出一个类型是 Transformation[a, b] 的子类型。对于一些 ab我们不知道。通过不使用通配符(并忽略 T 的实际参数),您让编译器准确地知道 T[a, b] 是什么。是的子类型。

关于scala - Scala 3 中的类型模式匹配和推理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67873989/

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