当前位置:  开发笔记 > 编程语言 > 正文

如何模式匹配scala列表的head和tail类型?

如何解决《如何模式匹配scala列表的head和tail类型?》经验,为你挑选了1个好方法。

我想在和的类型的pattern match不同部分的和:listscalaheadtail

class Solution07 extends FlatSpec with ShouldMatchers {
  "plain recursive flatten" should "flatten a list" in {
    val list1 = List(List(1, 1), 2, List(3, List(5, 8)))
    val list1Flattened = List(1, 1, 2, 3, 5, 8)

    flattenRecur(list1) should be (list1Flattened)
  }

  def flattenRecur(ls: List[Any]): List[Int] = ls match {
    case (head: Int) :: (tail: List[Any]) => head :: flattenRecur(tail)
    case (head: List[Int]) :: (tail: List[Any]) => head.head :: flattenRecur(head.tail :: tail)
    case (head: List[Any]) :: (tail: List[Any]) => flattenRecur(head) :: flattenRecur(tail) // non-variable type... on this line.
  }
}

我明白了:

错误:(18,17)类型模式中的非变量类型参数Int List [Int](List [Int]的基础)未被选中,因为它被擦除情况消除(head:List [Int])::(tail :List [Any])=> head.head :: flattenRecur(head.tail :: tail)^

我错过了什么?怎么可能对我来说,模式匹配的headtail类型列表中?



1> Archeg..:

我同意@Andreas解决方案与HList是解决问题的一个很好的例子,但我仍然不明白这有什么问题:

 def flatten(ls: List[_]): List[Int] = ls match {
    case Nil => Nil
    case (a: Int) :: tail => a :: flatten(tail)
    case (a: List[_]) :: tail => flatten(a) ::: flatten(tail)
    case _ :: tail => flatten(tail)
  }

然后:

println(flatten(List(List("one",9,8),3,"str",4,List(true,77,3.2)))) // List(9, 8, 3, 4, 77)

我没有看到任务中的类型擦除有任何问题,因为您实际上不需要测试被擦除的类型.我故意在我的示例中跳过所有已删除的类型 - 以显示此信息.类型擦除不会清除列表元素的类型信息,它只清除您拥有的列表通用的类型信息,Any或者_在我的情况下 - 所以您根本不需要它.如果我没有错过某些东西,在你的例子中,类型根本没有被删除,因为你无论如何Any几乎无处不在.

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有