gpt4 book ai didi

scala - 模式匹配 ,"::"未应用混淆

转载 作者:行者123 更新时间:2023-12-02 04:56:55 25 4
gpt4 key购买 nike

我是 scala 的新手,在研究模式匹配部分时,我感到很困惑。

val hd::tail = List(1,2,3,4,5)

执行此代码后,hd 将为 Int = 1,tail 将为 List[Int] = List(2, 3, 4, 5)。这段代码等于:

val ::(hd,tail) = List(1,2,3,4,5)

我了解到这段代码是模式匹配,它实际上调用了 unapply 方法。但是当我这样写代码时,编译错误:

val result = ::.unapply(List(1,2,3,4,5))

它说方法参数类型不匹配。 "::"的 unapply 方法需要一个 "::[?]"

有谁知道原因吗?

最佳答案

类型不匹配错误是因为 ::.unapply 采用 ::[T] 的实例而不是更通用类型 List[ 的实例T]。Scala 会自动添加与实际类型的匹配。换句话说,我的理解是当你这样做时:

val list = List(1,2,3,4,5)
val hd::tail = list

编译器生成类似这样的东西:

val list = List(1,2,3,4,5)
val (hd, tail) =
::.unapply(
// First match to test against input type
// (necessary as the static type of `list` is `List[Int]`
// so we don't know until runtime if it is an instance of `::[Int]`
// or an instance of `Nil`)
list match {
case nonEmptyList: ::[Int] => nonEmptyList
case _ => throw new MatchError
}
) match { // Second match to test against result of `::`.unapply
case Some( result ) => result
case _ => throw new MatchError
}

关于scala - 模式匹配 ,"::"未应用混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17816481/

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