如何模式匹配 scala 列表的头和尾类型?

2024-03-23

我想pattern match在a的不同部分list in scala关于的类型head and tail:

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.
  }
}

I get:

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

我缺少什么?我怎么可能在head and tail's types名单上的?


我同意 @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)
  }

Then:

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

我在您的任务中没有看到类型擦除有任何问题,因为您实际上不需要测试被擦除的类型。我在示例中故意跳过了所有已删除的类型 - 以展示这一点。类型擦除不会清除列表元素的类型信息,它仅清除您拥有的列表泛型的类型信息Any or _就我而言 - 所以你根本不需要它。如果我没有遗漏某些内容,那么在您的示例中,类型根本不会被删除,因为无论如何您都有Any几乎无处不在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何模式匹配 scala 列表的头和尾类型? 的相关文章

  • 将 Scala 文件转换为 Dll

    我有一些使用 IntelliJ 和 SBT Plugin 编写的 scala 代码 并希望将代码作为 C 的 DLL 提供给我 我已经尝试使用 ikvmc 我通过 package 将所有类打包在一个罐子中 之后 我手动设置一个 jar 其中
  • 写入 Delta 表时检测到架构不匹配 - Azure Databricks

    我尝试将 small radio json json 加载到 Delta Lake 表 在此代码之后我将创建表 我尝试创建 Delta 表 但收到错误 写入 Delta 表时检测到架构不匹配 可能与分区有关events write form
  • scala sbt 在多项目上测试运行设置和清理命令一次

    我知道我可以通过修改 testOptions 在 sbt 中添加设置和清理代码以用于测试阶段 例如 val embedMongoTestSettings Seq Setting Seq testOptions in Test Tests S
  • 简单的 Scala actor 问题

    我确信这是一个非常简单的问题 但很不好意思地说我无法理解它 我有一个 Scala 值列表 我想使用演员来并行地对每个值进行一些 外部 调用 我想等到所有值都已处理完毕 然后继续 没有共享值被修改 有人可以建议吗 Thanks Scala 中
  • 为什么我的 Project Euler Problem 12 算法这么慢?

    我已经在 Scala 中为 PE P12 创建了解决方案 但速度非常非常慢 有人可以告诉我为什么吗 如何优化这个 calculateDevisors 简单的方法和calculateNumberOfDivisors 除数函数具有相同的速度 i
  • scala.collection.breakOut 与视图

    这个答案 https stackoverflow com a 1716558 936869描述如何scala collection breakOut可用于防止创建浪费的中间集合 例如 这里我们创建一个中间体Seq String String
  • Spark:用列的平均值替换数据框中的空值

    如何创建 UDF 以编程方式将每列中 Spark 数据框中的空值替换为列平均值 例如 在示例中 数据 col1 空值的值为 2 4 6 8 5 5 5 示例数据 col1 col2 col3 2 null 3 4 3 3 6 5 null
  • Scala 组合器解析器 - 区分数字字符串和变量字符串

    我正在做 Cay Horstmann 的组合器解析器练习 我想知道区分代表数字的字符串和代表匹配语句中变量的字符串的最佳方法 def factor Parser ExprTree wholeNumber expr ident case a
  • 了解 Scala 中的中缀方法调用和缺点运算符(::)

    我对 Scala 编程语言相当陌生 当我遵循以下网站的讲义时 我正在尝试一些萦绕在我脑海中的东西 here http horstmann com sjsu cs152 04 closures1 html 我想我无法真正理解 cons 运算符
  • Scala Array.apply 有何魔力

    来自 scala 2 10 4 的 array scala Array定义为 final class Array T length Int extends java io Serializable with java lang Clonea
  • 有没有办法捕获 Spark 中使用通配符读取的多个 parquet 文件的输入文件名?

    我使用 Spark 将多个 parquet 文件读取到单个 RDD 中 并使用标准通配符路径约定 换句话说 我正在做这样的事情 val myRdd spark read parquet s3 my bucket my folder parq
  • Source.getLines 中的默认参数错误 (Scala 2.8.0 RC1)

    假设我运行 Scala 2 8 0 RC1 以下 scala 代码应该打印出文件 c hello txt 的内容 for line lt Source fromPath c hello txt getLines println line 但
  • 使用 Spray-json 解析简单数组

    我正在尝试 但失败了 了解 Spray json 如何将 json feed 转换为对象 如果我有一个简单的 key gt value json feed 那么它似乎可以正常工作 但是我想要读取的数据出现在如下列表中 name John a
  • 如何捕获 Oozie Spark 输出

    有没有办法捕获spark的输出然后将其输入到shell上 我们当前正在使用 scala 创建 jar 文件 并希望我们的 Spark 输出成为 shell 输入 我的想法是使用 wf actionData spark XXXX var 我只
  • 如何在 Scala 中打印任何内容的列表?

    目前我有一个打印整数的方法 def printList args List Int Unit args foreach println 我如何修改它 使其足够灵活 可以打印任何内容的列表 您不需要专用的方法 所需的功能已经在集合类中 pri
  • 使用 Spark DataFrame 获取组后所有组的 TopN

    我有一个 Spark SQL DataFrame user1 item1 rating1 user1 item2 rating2 user1 item3 rating3 user2 item1 rating4 如何按用户分组然后返回TopN
  • Scala Tuple2Zipped 与 IterableLike zip

    两种实现有什么区别 这个比那个好吗 有一篇博客文章说 Tuple2Zipped 性能更好 但没有提供原因 并且查看源代码我没有看到差异 val l1 List 1 2 3 val l2 List 5 6 7 val v1 l1 zip l2
  • 缓存 Slick DBIO 操作

    我正在尝试加快 SELECT FROM WHERE name 的速度Play 中的查询类型 Scala 应用程序 我正在使用 Play 2 4 Scala 2 11 play slick 1 1 1 包 该软件包使用Slick 3 1版本
  • 类型级编程有哪些示例? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我不明白 类型级编程 是什么意思 也无法使用Google找到合适的解释 有人可以提供一个演示类型级编程的示例吗 范式的解释和 或定义将
  • 分析 sbt 构建

    我的 sbt 构建需要很长时间 它又大又复杂 很难知道从哪里开始清理 看起来 sbt 保留了很多关于构建结构的元数据 包括相互依赖关系 命名任务 范围界定等 有了所有这些元数据 似乎很容易跳入并测量每个不同任务 及其范围 花费的时间 在代码

随机推荐

  • 在 Ember.JS ember-cli 应用程序中包含引导库的推荐方法

    我正在尝试在当前的 ember cli 项目中正确安装 Twitter Bootstrap 我确实用 Bower 安装了 bootstrap bower install save bootstrap 现在库已下载到 vendor boots
  • 如何使用AES解密使用openssl命令加密的Java文件?

    我需要使用以下命令在 JAVA 中解密在 UNIX 中加密的文件 openssl aes 256 cbc a salt in password txt out password txt enc mypass mypass 我必须在 java
  • 如何从 JavaScript 中的字符串中删除单词数组?

    我有一个可以从字符串中删除单词的函数 这是 var removeFromString function oldStr fullStr return fullStr split oldStr join 我这样使用它 console log r
  • Maven 部署:即使工件已经存在也强制部署

    我正在构建一个项目 它由几个 有时不相关的 模块和一些更多的非标准 java 模块 使用 ANT 构建 组成 每个 Maven 模块在完成后都会部署到发布存储库 如果构建在中间失败 我可能已经部署了一些模块 因此如果我尝试重建 新的部署尝试
  • 退出和退出有什么区别!在红宝石中?

    退出和退出有什么区别 在红宝石中 几件事 退出处理程序以 exit 形式运行 但不是 exit 这意味着分配给 清理 的任何代码都不会使用 退出 来运行 退出 中的 退出状态 默认设置为 false 形式 而在 退出 形式中则为真 退出状态
  • 使用 xlrd 时读取包含公式的单元格值会返回 0.0

    我尝试读取单元格值 例如 Excel 工作表中的 E5 和 E5 包含一个公式 A29 A2 我使用以下代码 它返回 0 00 而不是实际值1 440408 有办法解决这个问题吗 我想打印正确的值 请在这件事上给予我帮助 谢谢 book x
  • jQuery 在 Chrome 和 Mac OS 上停止运行

    看看这个小提琴 http jsfiddle net mattball nWWSa http jsfiddle net mattball nWWSa var lis ul innerfade gt li function fadeThemOu
  • 适用于商品 Linux 存储场的最佳分布式文件系统 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有很多闲置的英特尔 Linux 服务器 数百台 并且希望将它们用于 Web 托管和文件共享环境中的分布式文件系统 这不适用于 HPC 应用程序
  • 如何按顺序获取int中的每个数字?

    我有一个整数 int iNums 12476 我想从中获取每个数字作为整数 就像是 foreach iNum in iNums printf i iNum 所以输出将是 1 2 4 7 6 但我需要每个数字作为int not as char
  • 在类中找不到 main(String[]) 方法

    我收到以下错误 在类中找不到 main String 方法 import java util class Coor int x y w Coor int x int y int w this x x this y y this w w cl
  • gtkmm 的 CMake 错误

    我正在使用 Debian 8 并安装了 libgtkmm 3 0 以及 dev 现在我有一个使用 gtkmm 的非常简单的程序 基本上是一个 Hello World 主要 cpp include include BrowserWindow
  • 如何用许多随机数填充 MySQL 表?

    我要问一个已经被问过的问题very https stackoverflow com questions 9505930 populate mysql table with random data in python抽象的terms http
  • 无法从“字符串”转换为“System.IFormatProvider”

    这段代码给了我这个错误 var n 9 7 2014 8 22 35 AM var m n ToString yyyy MM dd T HH mm ssZ 但这段代码可以正常工作 并以正确的格式返回日期 var n DateTime Now
  • 如何正确使用实时优先级

    我的问题可能并不是真正关于实时处理 但话又说回来 它可能是 我的应用程序有几个比 GUI 重要得多的线程 但是 我确实希望 GUI 至少可用 我不希望它始终锁定 并且我确实想根据我正在执行的处理结果更新屏幕 目前 我的所有必需项目都隔离在单
  • 随机森林回归中的样本大小

    如果理解正确 当计算随机森林估计量时 通常会应用引导法 这意味着仅使用来自样本 i 的数据构建树 i 并通过替换选择 我想知道sklearn的样本大小是多少随机森林回归器 http scikit learn org stable modul
  • R 错误:影子图形设备错误

    是的 我知道上述错误有很多线索 但 至少我 无法找到解决方案 因此 RStudio 在尝试绘制某些内容时出现以下错误 Error in RStudioGD Shadow graphics device error r error 4 R c
  • 加载生成的纹理数据在 Libgdx/Lwjgl 中是不确定的

    数据格式如下 final int width 256 final int height 256 final float data new float width height 4 FloatBuffer dataBuf int textur
  • Makefile 规则错误:*** 混合隐式规则和普通规则

    在内核Makefile中 Modules prepare scripts FORCE cmd crmodverdir Q MAKE KBUILD MODULES if CONFIG MODULES 1 build build dir ko
  • Laravel 5 - 重定向到 HTTPS

    正在处理我的第一个 Laravel 5 项目 但不确定在哪里或如何放置逻辑以在我的应用程序上强制使用 HTTPS 这里的关键是有许多域指向该应用程序 并且只有三分之二使用 SSL 第三个是后备域 说来话长 所以我想在我的应用程序逻辑而不是
  • 如何模式匹配 scala 列表的头和尾类型?

    我想pattern match在a的不同部分list in scala关于的类型head and tail class Solution07 extends FlatSpec with ShouldMatchers plain recurs