【发布时间】:2014-02-06 13:34:18
【问题描述】:
假设我有一个从2 到20 的所有整数的列表。
[2 .. 20]
我想使用函数f x 过滤列表(或者它是谓词?我不太习惯 Haskell 编程中使用的所有术语)。如果n 位置的元素对于这个函数f 等于true,我想删除位置n-1、n 和n+1 的元素。
示例:
假设列表[2 .. 20] 中位置4 的元素等于6,对于函数f 等于true。然后我想删除位置3、4和5的元素,它们分别等于5、6和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 和n-1 的元素)的值更改为0,或以其他方式标记/标记它们,而不是完全删除它们。这样做的原因是我想继续“删除”元素,直到列表不再有任何适合谓词(及其前面的元素)的元素。我只想从原始列表中“删除”它们。
由于我的方法与原来的问题相比发生了很大变化,我将发布一个新问题来反映我的新方法。我要感谢您的所有回复,我从您的回答中学到了很多东西。谢谢!
编辑 2:这是我的新问题:Remove elements at positions n and n-1 in a Haskell list, when n fits a predicate
【问题讨论】:
-
对于您的删除函数,谓词只是一个变量。我建议学习模式匹配。顺便说一句,这是学习高级 ist 处理的好任务。
-
如果位置 4 的元素和位置 5 的元素都通过谓词怎么办?哪些元素会被移除?位置 3、4、5 和 6 的元素?
-
你直接指出了 Haskell 的列表有点糟糕的地方。 AFAIK,没有标准的组合器来处理元素之间的逻辑依赖关系。我只能建议使用显式递归或拉链。