根据 Haskell 列表中 n 的条件删除元素 n-1、n 和 n+1

2024-01-30

假设我有一个包含所有整数的列表2 to 20.

[2 .. 20]

我想使用函数过滤列表f x(或者它是一个谓词?我不太习惯 Haskell 编程中使用的所有术语)。如果元素在位置n对于该函数等于 truef,我想删除位置上的元素n-1, n and n+1.

例子: 假设列表中位置 4 的元素[2 .. 20],这等于6, 等于该函数的 truef。然后我想删除位置上的元素3, 4 and 5,等于5, 6 and 7分别。 所以我的最终清单如下:

[2,3,4,8,9,10,11,12,13,14,15,16,17,18,19,20]

我是一个没有经验的 Haskell 程序员,只是为了好玩。我曾考虑过使用 lambda 函数作为谓词,但我不太确定如何去做。我也考虑过使用像这样的函数remove xs ys删除所有元素xs这也是一个元素ys,但我也不知道该怎么做。

任何帮助,将不胜感激!

编辑:我意识到为了产生我想要的结果而删除两个相邻元素是错误的。此外,最好只更改受影响元素的值(位于位置的元素)n and n-1) to 0,或以其他方式标记/标记它们,而不是完全删除它们。原因是我想继续“删除”元素,直到列表不再有任何适合谓词的元素(及其前面的元素)。我只想将它们“删除”原来的名单。 由于我的方法与原始问题相比发生了很大变化,因此我将发布一个新问题来反映我的新方法。我要感谢您的所有回复,我从您的回答中学到了很多东西。谢谢你!

编辑2:这是我的新问题:当 n 符合谓词时,删除 Haskell 列表中位置 n 和 n-1 处的元素 https://stackoverflow.com/questions/21185550/remove-elements-at-positions-n-and-n-1-in-a-haskell-list-when-n-fits-a-predicat


您可以对多个元素进行模式匹配,然后将过滤器应用于中间的元素。

eitherside :: (Int->Bool) -> [Int] -> [Int]
eitherside f (i1:i2:i3:is) = if (f i2) 
    then eitherside f is 
    else i1 : (eitherside f (i2:i3:is))
eitherside f is = is
*Main> eitherside (==4) [1..10]
[1,2,6,7,8,9,10]
*Main> eitherside (==5) [1..10]
[1,2,3,7,8,9,10]
*Main> eitherside (==6) [1..10]
[1,2,3,4,8,9,10]

不是这样的(我原来的帖子):

eitherside :: (Int->Bool) -> [Int] -> [Int]
eitherside f (i1:i2:i3:is) = if (f i2) 
    then eitherside f is 
    else [i1,i2,i3] ++ (eitherside f is)
eitherside f is = is
*Main> eitherside (==5) [1..10]
[1,2,3,7,8,9,10]

这个坏的碰巧对 5 有效,但对 6 失败,因为我在“else”分支中跳过了它。

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

根据 Haskell 列表中 n 的条件删除元素 n-1、n 和 n+1 的相关文章

随机推荐

  • 检测 window.location 的变化

    我正在尝试检测 window location 中的更改 例如 如果用户尝试重新加载页面 则会收到通知 但我似乎找不到方法来做到这一点 有一些与之相关的事件吗 Thanks The unload当用户离开页面时触发该事件 还有一个befor
  • 异步/同步 JavaScript

    我在理解异步和同步 Javascript 之间的区别时遇到了一些困难 希望有人能对此有所了解 我知道 Javascript 本质上是同步的 但您可以使用异步事件 回调来改变程序流程 但是 如果您调用包含 AJAX 且没有回调的函数 会发生什
  • 通过 url 将参数传递给 python azure 函数

    我试图通过 azure 函数使 hello world 示例适用于 python 基本函数尝试通过 url 检索输入的名称 然后响应 Hello Name 事实证明 通过天蓝色门户提供的示例模板不能开箱即用 基本示例如下所示 import
  • 在 SwiftUI 中根据宽度计算每行的项目数

    这是我之前问题的延伸 在 SwiftUI 中使用获取视图的宽度 https stackoverflow com questions 57577462 get width of a view using in swiftui 57591483
  • apache 到 tomcat:mod_jk 与 mod_proxy

    使用有什么优点和缺点mod jk and mod proxy用 apache 来处理 tomcat 实例 我多年来一直在生产中使用 mod jk 但我听说这是前端 tomcat 的 旧方法 我应该考虑改变吗 会有什么好处吗 这些模块的优缺点
  • 触摸屏平板电脑上的 WPF Scrollviewer

    我正在编写一个 WPF 应用程序 它将在完整的 Windows 8 触摸屏平板电脑 而不是 RT 上运行 但是触摸滚动似乎不起作用 所以我想知道我是否做错了什么或者是否有可能 所以 我有一个带有滚动查看器的 WPF 窗口 在该滚动查看器中
  • pandas 3x3 散点矩阵缺少标签

    我使用以下代码创建一个 pandas 散点矩阵 import numpy as np import pandas as pd a np random normal 1 3 100 b np random normal 3 1 100 c n
  • Jenkins 环境变量在构建后步骤中可用

    据我所知 Jenkins 在构建执行期间设置了某些环境变量 但我的问题是我可以在构建后脚本中访问这些变量吗 我进行了快速测试 但无法从构建后步骤 python 脚本访问 PROJECT NAME 和 BUILD URL 等 有没有办法可以从
  • 如何在linq中直接执行SQL查询

    在 C 和 VS 2008 中 我有一个查询 在这个查询中我连接了多个表 所以我不知道类型 我想知道如何在 linq 中直接运行 sql 查询 IEnumerable
  • tomcat中connectionTimeout的含义

    这个参数对于tomcat来说意味着什么 它被宣布于server xml如下
  • OpenCV K 均值 (kmeans2)

    我正在使用 Opencv 的 K means 实现来对一大组 8 维向量进行聚类 它们聚类得很好 但我找不到任何方法来查看聚类过程创建的原型 这可能吗 OpenCV 似乎只提供对集群索引 或标签 的访问 如果没有 我想是时候自己实现了 我不
  • 为什么我可以在 constexpr 函数内调用非 constexpr 函数?

    考虑以下代码 include
  • AccessibilityService - PerformGlobalAction 无法在自己的应用程序中工作

    我正在尝试通过发送系统返回新闻事件AccessibilityService这工作正常 但前提是我不在自己的应用程序中 我总是得到true from performGlobalAction无论我是否在自己的应用程序中 但只有当我不在自己的应用
  • 在可排序 UI 中制作表格行向上移动的动画

    我使用 Sortable jQuery UI 来允许用户拖放表行 这允许用户根据自己的偏好对表中的项目进行排名 用户完成对列表的排序后 他们按下保存按钮 该按钮将执行 Ajax 调用 新排名将保存到数据库中 并且表格会简要突出显示 我现在添
  • Rebus 和远程队列

    我正在使用画笔画 https github com rebus org https github com rebus org v 0 83 到目前为止 它都是在一台机器上进行的 现在我需要使用从我的网站到应用程序服务器的远程队列 我不太清楚
  • 适用于 Windows 的 LLVM C++ IDE

    是否有一些适用于 Windows 的 C C IDE 融合的使用 LLVM 编译器 和 Clang C C 分析器 就像现代 Xcode 一样 我有 Dev Cpp 它使用过时的 GCC 并且代码 块 https en wikipedia
  • db2 中批量更新比单次更新快吗?

    我有一个包含 10 列的表 该表中有数千 数百万行 在某些情况下 我想一次更新超过 10K 条记录 目前我的场景代码按顺序工作 for i in primary key ids for all records to be updated e
  • 在 Mercurial 中回滚多个提交(在推送到公开之前)

    我知道回滚可以从本地存储库中的最新变更集中删除提交 但是 是否可以删除自上次推送以来的所有最新提交 而无需重新克隆共享存储库 您可以使用hg strip命令的一部分mq扩大 hg strip REV 这将删除该修订及其所有后代 在尝试此操作
  • 将用户控件属性绑定到自定义类

    在我的应用程序中我使用的是usercontrol称为 ChannelControls 我在主窗口上实例了 6 次 public partial class ChannelControls UserControl CMiXData cmixd
  • 根据 Haskell 列表中 n 的条件删除元素 n-1、n 和 n+1

    假设我有一个包含所有整数的列表2 to 20 2 20 我想使用函数过滤列表f x 或者它是一个谓词 我不太习惯 Haskell 编程中使用的所有术语 如果元素在位置n对于该函数等于 truef 我想删除位置上的元素n 1 n and n