【发布时间】:2014-01-17 12:03:17
【问题描述】:
假设我有一个从2 到20 的所有整数的列表。
[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
我还有一个函数f x,它返回True 或False。当我将此函数应用于位置n 的元素并且它等于True 时,我想删除它及其前面的元素(即位置n-1 的元素)。我想继续这样做,直到列表中没有函数等于 True 的元素以及它们之前的元素。
示例:
假设位置11 的元素等于13,符合谓词。然后我想删除位置10 的元素,它也等于12。之后我的最终名单将是:
[2,3,4,5,6,7,8,9,10,11,14,15,16,17,18,19,20]
我们还假设位于4、8 和15 的元素是唯一符合谓词的元素(除了位于13 的元素)。删除它们及其前面的元素后,我的最终列表将如下所示:
[2,3,4,7,8,11,14,15,18,19,20]
我是一个没有经验的 Haskell 程序员,只是为了好玩。我曾想过使用某种 lambda 函数作为过滤器的谓词,或者创建一个像 listRemove xs ys 这样的函数来删除 xs 的所有元素,这些元素也是 ys 的一个元素,但我对两者都有点迷茫。
任何帮助将不胜感激!
编辑:我要做的是解决Project Euler 问题,即#179。谓词f x 是检查x 是否为质数。因此,我可以肯定地说不存在极端情况——例如。没有像[x, x, t, t] 这样的情况,其中t 是谓词成立的数字,因为除了2 和3 之外,不存在两个连续的素数整数,我可以在我的解决方案。相反,您可以获得的最接近的是[x, t, x, t],在这种情况下,我想删除所有这些元素。
【问题讨论】:
-
我不确定自从你的previous, similar question 之后发生了什么变化。您似乎有某种目的,但您没有与我们分享-也许您可以解释原始问题,因为可能有一种直接解决该问题的优雅方法。请阅读XY problems。
-
从表面上看,您可以稍微重新整理上一个问题的答案,但是您对上一个问题的编辑介绍了这个问题,其中包含的想法比这更多。您提到替换或编辑值。如果您想用 20*5 替换 19 和 20,因为 20 满足您的谓词,您是否也想根据您的谓词检查新的 100?您是否尝试过旧问题的回答者提供的代码?
-
您的删除操作没有明确定义,您必须指定一个顺序。那么极端情况(x,x,t,t)呢,其中
t是谓词所在的元素?它应该返回 (),因为 (x,x,t,t) -> (x,t) -> () [我们删除内部 (x,t)] 或 (x,x) [我们删除 (t ,t)]? -
@Zeta 另一个好点。让我们谈谈问题背景的另一个原因。 (不过,我认为您的意思是方括号。)
-
@chunksOf50:格式不是 Haskell 特定的,只是想显示一个有序集合。