gpt4 book ai didi

vararg 的 Scala 模式匹配

转载 作者:行者123 更新时间:2023-12-03 23:43:06 25 4
gpt4 key购买 nike

我只是想对 Scala 进行一些实践,并尝试自己实现 List.concat 函数。这是代码

  def concat[A](lists : Traversable[A]*):List[A]={
println("concat called")
lists match {
case Nil => Nil
case x :: Nil => (x :\ List.empty[A])((elem,list)=> elem::list)
case x:: xs => (x :\ concat(xs:_*))((elem,list)=> elem :: list)
}
}

但是,当我尝试调用此方法时
concat(List(1,2,3),List(2,3,4),List(4,5,6),List(6,7,8))

我得到错误
Exception in thread "main" scala.MatchError: WrappedArray(List(1, 2, 3), List(2, 3, 4), List(4, 5, 6), List(6, 7, 8)) (of class scala.collection.mutable.WrappedArray$ofRef)

有人可以解释我在这里做错了什么吗?
提前致谢

最佳答案

Varags 是 Seq你可以像在 Seq 上一样匹配它,不像在列表中。下面是一个例子:

@ a(1, 2, 3) 
res1: Seq[Int] = Array(1, 2, 3)
@ def a(x: Int*) = x match {
case Seq() => "empty"
case Seq(a) => s"single $a"
case Seq(a, as @ _*) => s"multiple: $a, $as"
}
defined function a
@ a(1, 2, 3, 4)
res3: String = "multiple: 1, WrappedArray(2, 3, 4)"
@ a(1, 2)
res4: String = "multiple: 1, WrappedArray(2)"
@ a(1)
res5: String = "single 1"

Nil 上做这样的匹配和 x :: xs通常意味着,您可以简单地使用 foldLeft ,它就是这样做的。
def concat[A](lists: Traversable[A]*): List[A] =
lists.foldLeft(List.empty[A])(_ ++ _)

请注意,匹配于 Nilx :: xs , 其中 xs可以 Nil , 足够。您的第二个 case可以简单地删除。

看看那些:
case Nil => Nil
case x :: Nil => (x :\ List.empty[A])(_ :: _)
case x :: xs => (x :\ concat(xs:_*))(_ :: _)

最后两个是一样的。如果在第三种情况下 xs == Nil然后代替 concat(xs:_*)你会得到你的 Nil , 与 List.empty[A] 相同(如果类型被正确推断)。

关于vararg 的 Scala 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37088903/

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