需要根据元素升序将列表划分为列表(Haskell)

2023-11-22

假设我有这样的列表:

[4,5,6,7,1,2,3,4,5,6,1,2]

我需要一个 Haskell 函数来将该列表转换为一个列表列表,该列表由原始列表的片段组成,这些片段按升序形成一系列。所以结果应该是这样的:

[[4,5,6,7],[1,2,3,4,5,6],[1,2]]

有什么建议么?


你可以通过手动递归来做到这一点,但我相信 Haskell 是一种更进化的语言。让我们看看是否可以开发一个使用现有递归策略的解决方案。首先进行一些预备工作。

{-# LANGUAGE NoMonomorphismRestriction #-}
-- because who wants to write type signatures, amirite?
import Data.List.Split -- from package split on Hackage

第一步是观察我们想要根据同时查看列表中两个元素的标准来拆分列表。因此,我们需要一个新列表,其中的元素代表“上一个”和“下一个”值。有一个非常标准的技巧:

previousAndNext xs = zip xs (drop 1 xs)

然而,就我们的目的而言,这不太有效:这个函数总是输出一个比输入短的列表,并且我们总是想要一个与输入长度相同的列表(特别是我们想要一些输出,即使当输入是长度为 1 的列表)。因此,我们将使用“空终止符”稍微修改一下标准技巧。

pan xs = zip xs (map Just (drop 1 xs) ++ [Nothing])

现在我们将在这个列表中查找前一个元素大于下一个元素(或者下一个元素不存在)的位置。让我们编写一个谓词来执行该检查。

bigger (x, y) = maybe False (x >) y

现在让我们编写实际执行拆分的函数。我们的“分隔符”将是满足以下条件的值bigger;我们不想扔掉它们,所以让我们保留它们。

ascendingTuples = split . keepDelimsR $ whenElt bigger

最后一步是将构造元组的位、分割元组的位组合在一起,并进行最后的修改以丢弃我们不关心的元组的位:

ascending = map (map fst) . ascendingTuples . pan

让我们在 ghci 中尝试一下:

*Main> ascending [4,5,6,7,1,2,3,4,5,6,1,2]
[[4,5,6,7],[1,2,3,4,5,6],[1,2]]
*Main> ascending [7,6..1]
[[7],[6],[5],[4],[3],[2],[1]]
*Main> ascending []
[[]]
*Main> ascending [1]
[[1]]

附:在当前版本中split, keepDelimsR比需要的稍微严格一些,因此ascending目前不适用于无限列表。不过,我已经提交了一个补丁,让它变得更加懒惰。

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

需要根据元素升序将列表划分为列表(Haskell) 的相关文章

  • 如何动态访问数据帧列表中的特定属性

    我有一个数据 它是数据框的列表 我正在尝试访问列表中每个数据帧内的特定属性 可以提取特定属性DP UniqueId使用下面的代码 gt attr new data A AA SpotfireColumnMetaData DP UniqueI
  • 计算出类型索引的自由 monad 的细节

    我一直在使用免费的 monad 来构建 DSL 作为语言的一部分 有一个input命令 目标是在类型级别反映输入原语期望的类型 以提高安全性 例如 我希望能够编写以下程序 concat Action String String concat
  • ~/.cabal/config 中的“共享”是什么意思?

    我想 共享 会让cabal install更快 对吧 共享的默认值为 False 我们应该使用 True 还是 False 来共享 thanks 这意味着 还构建动态链接 又名共享 版本的库 这些版本与cabal install cabal
  • 链表分区函数及反转结果

    我编写了这个 F 函数来将列表分区到某个点并且不再进一步 很像之间的交叉takeWhile and partition let partitionWhile c l let rec aux accl accr match accr with
  • 在类型级别未定义

    通常 当我使用 Haskell 代码时 我会使用类型注释将内容存根并undefined foo String gt Int foo undefined 是否有类型级别的 未定义 我可以以类似的方式使用 理想情况下 与某种注释结合使用 typ
  • Haskell Stack 包安装错误

    user stack install dictionaries Error While constructing the build plan the following exceptions were encountered In the
  • 如何从有向无环图导出FRP?

    我目前正在研究我的下一个项目 目前处于预规划阶段 因此这个问题只是为了了解现有技术的概述 Setup 我有一个具有多个输入和输出的有向无环图 DAG 现在考虑人工神经网络 处理这种结构的常见方法是在每个 时间 步骤上处理整个网络 我相信这是
  • Haskell 如何将整数文字转换为不同类型?

    我有以下匿名函数 Exercises gt g Sum n gt Sum n 1 我这样使用它 Exercises gt g Sum 56 Sum getSum 55 Exercises gt g 56 Sum getSum 55 第二个例
  • List.Enumerator IEnumerator.Reset() 方法实现

    尽管事实如此 IEnumerator Reset永远不应该使用方法 https stackoverflow com a 5968973 1163867我发现方法实现的奇怪行为List
  • 如何在 Python 中以列表形式返回字典键?

    使用Python 2 7 我可以获得字典keys values or items as a list gt gt gt newdict 1 0 2 0 3 0 gt gt gt newdict keys 1 2 3 使用 Python gt
  • 用另一个列表替换列表的扩展切片

    我有一个清单s如下所示 s list range 1 11 我正在更换slice of s 使用下面的代码 s 1 4 0 0 0 0 print s Output 1 0 0 0 0 5 6 7 8 9 10 但是 当尝试分配相同的列表时
  • 免费在线网络开发工具列表[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 What free onlineWeb 开发人员有哪些可用且 应该了解 的工具 为了设定列表的精神 这里有一些例子 谷歌代码游乐场 htt
  • 不明确的类型变量

    相关我之前关于遍历数据结构的问题 https stackoverflow com questions 1855371 avoiding boilerplate when dealing with many unrelated types 当
  • 优化计算 200 万以下所有素数总和的 Haskell 代码

    欧拉计划中的问题 10 我在那里看到了一些讨论 但仅限于 C 我用下面的代码来计算 print sum sieve 2 2000000 where sieve sieve x xs x sieve filter 0 mod x xs 需要很
  • 数据记录的类约束

    我有一个data type data BuildException a KillBuild JobID a Stage FailBuild JobID a Stage CancelBuild JobID a Stage StopBuild
  • 从 Pandas 的 DatetimeIndex 中创建月份和年份的列表

    我有一个信息数据框 我将索引设置为接收的日期和时间 现在我想要一个清单 我设置 df 索引这样做 df index pd to datetime df index format m d Y H M 这给了我这个 print df index
  • 追踪 Haskell 中的错误

    我如何获得有关 Haskell 错误发生位置的更多信息 例如 昨天我正在开发一个 Haskell 程序 该程序解析输入文件 转换数据 然后打印出报告信息 有一次 我跑了 main 然后回来了 Prelude read parse error
  • 带边界的 haskell 列表数据类型

    我有以下类型定义来表示卡片 data Suit Hearts Spades Diamonds Clubs data Rank Numeric Integer Jack Queen King Ace data Card Card Rank S
  • Haskell 中的纯函数是否有可能改变变量的本地副本?

    Haskell 中的纯函数是否有可能改变变量的本地副本 就像 clojure 中提到的那样函数式编程是一个骗局 http swannodette github io 2013 06 10 porting notchs minecraft d
  • Haskell 乘加运算的数学性能

    我正在用 Haskell 编写一个游戏 我当前在 UI 上的传递涉及大量几何图形的程序生成 我目前专注于识别一项特定操作的性能 C ish 伪代码 Vec4f multiplier addend Vec4f vecList for int

随机推荐

  • 以编程方式在 TextView 中设置左侧可绘制对象

    我这里有一个 xml 中的 textView
  • bool 读/写操作在 x86 上可以不是原子的吗? [复制]

    这个问题在这里已经有答案了 假设我们有两个线程 一个正在循环中读取布尔值 另一个可以在特定时间切换它 我个人认为这应该是原子的 因为sizeof bool 在 C 中是 1 个字节 并且您不会部分读取 写入字节 但我想 100 确定 那么是
  • 立即更新解决方案中所有项目的参考路径

    我需要添加解决方案中所有项目 超过 35 个项目 的参考路径 手动执行此操作将非常耗时 有没有办法以编程方式更新 添加 删除所有项目的引用路径 我找到了一个可以满足我需要的插件 但不幸的是加载项下载链接被打破 您始终可以在文本编辑器中打开
  • 如何向Android框架添加系统服务

    我想添加我自己的在 Android system server 中运行的框架代码 处理所有系统级服务 我的服务加载一个 JNI 库 该库与我添加到内核中的驱动程序进行通信 该服务旨在允许应用程序向其注册侦听器以从驱动程序获取更新 我发现了一
  • 从 Scala 的 Future 中获取数据

    I ve a Future List Person 1 我想要得到List Person 从中 我该怎么做 import scala concurrent Future val futPersons Future List Person 有
  • Laravel 5.3 -VerifyCsrfToken.php 第 68 行中的 TokenMismatchException:

    当我登录我的应用程序并在输入后立即返回 然后尝试注销时 我从标题中收到错误消息 我该如何解决该问题 我在 laravel 5 4 中遇到了同样的问题 然后以下命令对我有用 chmod 777 存储 框架 会话 在此之前 它是 chmod 7
  • 使用postman发送json api对象

    我正在使用 JSONAPI 规范http jsonapi org format status 我有如下数据 data type tag id 1 attributes name Test 如何使用 postman chrome 扩展向端点发
  • 有没有办法在安装核心服务(Spark 等)后设置引导操作在 EMR 上运行?

    有没有办法在安装核心服务 Spark 等 后设置引导操作在 EMR 上运行 我正在使用 emr 5 27 0 您可以提交一些脚本作为step 不是引导程序 例如 我制作了一个SSL证书更新脚本 并通过步骤将其应用到EMR中 这是我用 Pyt
  • BadPaddingException 解密 Android 中的加密数据

    我对 Android 安全概念不熟悉 我一直在阅读一些博客 以了解我们可以使用公钥加密数据 并可以使用相应的私钥解密数据 加密似乎没有任何问题 但是当我尝试解密它时 它会抛出 javax crypto BadPaddingException
  • 我的应用程序如何发送带有照片的彩信?

    我想从我的应用程序撰写一条消息 其中可以包含照片 例如 我在 iPhone 中输入了我的相册并打开了一张照片我可以单击选项 然后单击彩信选项卡 照片将添加到消息中然后我可以将其发送给我想要的任何联系人 我想要的是 当我单击应用程序上的按钮时
  • 使用 gtools::mixedsort 或 dplyr::arrange 的替代方案

    我正在尝试通过使用来订购数据框dplyr arrange 问题是我尝试排序的列包含一个固定字符串后跟一个数字 例如由下面的虚拟代码生成的 dummydf lt data frame values rnorm 100 sortcol past
  • 为什么 a[c] 覆盖 a[b]? [复制]

    这个问题在这里已经有答案了 我不明白为什么输出是456 我认为a b 中的b是一个对象的属性 而c是a的另一个属性 它们与 var b 和 c 完全无关 但为什么 a c 会覆盖 a b 呢 var a b key b c key c a
  • 错误:“:”不是有效的资源名称字符

    我已将 Eclipse 项目导入到 android studio 我用 google 搜索但没有得到正确的答案 发生这些错误 D app src main res values strings xml Error Error is not
  • 测量 Android 上的数据漫游流量?

    刚从冰岛度过一个愉快的假期回来 正在等待我的电话公司的数据漫游账单 我希望尽可能限制我的流量 但我想提前知道 我使用了非常好的应用程序网络计数器但它根本没有测量漫游数据流量 所以我想构建自己的应用程序 仅测量漫游数据流量 我有一些布尔值要开
  • 使用 == 比较 numpy 数组的规则是什么?

    例如 尝试理解这些结果 gt gt gt x array 0 1 2 3 4 5 6 7 8 9 gt gt gt x np array 1 2 astype np float32 array 0 1 0 0 0 0 0 0 0 0 0 0
  • npm run 分段错误:11

    我正在尝试 npm run HOT 1 node node modules bin react native webpack server start hot 收到此错误 gt email protected hot Users user
  • Chartkick 柱形图多种颜色

    我在用着图表踢在我的 RoR 项目中生成图表 效果非常好 与谷歌图表一起 我创建了一个柱形图 with 只有 2 个酒吧 男性和女性 现在客户希望每个条形都有不同的颜色 那可能吗 我看过这个帖子 如何更改使用 Chartkick 创建的柱形
  • 如何显示 bash 会话的当前进程树?

    我想创建一个 bash 别名 它为我提供从我正在使用的当前 bash 会话到 init 的进程树 用例是为了知道我是否使用过bash or vi s shell命令 我正在使用 MacOS X 我听说过pstree 但是好像只显示子进程 而
  • 在 Typescript 中向数组添加属性

    我正在尝试向 Typescript 中的 Array 对象添加一个方法 我已经在 SO 上找到了其他解决方案 但这些解决方案都不适合我 我的代码如下所示 interface Array average gt number Array pro
  • 需要根据元素升序将列表划分为列表(Haskell)

    假设我有这样的列表 4 5 6 7 1 2 3 4 5 6 1 2 我需要一个 Haskell 函数来将该列表转换为一个列表列表 该列表由原始列表的片段组成 这些片段按升序形成一系列 所以结果应该是这样的 4 5 6 7 1 2 3 4 5