【问题标题】:Filtering a List Haskell过滤列表 Haskell
【发布时间】:2014-11-27 11:32:21
【问题描述】:

我刚开始学习有关过滤列表的 Haskell。 假设我有以下列表:[2, 3, 4, 5, 8, 10, 11] 我想只保留列表中那些不能被其他成员整除的数字。

我们示例的结果是:[2, 3, 5, 11]

【问题讨论】:

  • 最小倍数是什么意思
  • 然后呢?你尝试了什么?你被困在哪里了?
  • @VincentBeltman 我在示例中提供了更多详细信息,谢谢
  • 您不是要求过滤器,而是要求减少。 foldl1 gcd xs 给出你的结果。不能是过滤器,因为min(2,3)的结果是1,而1不在[2,3]
  • min(2,3) 表示 2 到 3 之间的最小值

标签: list haskell


【解决方案1】:
[x | x <- src, all (\y -> x `rem` y /= 0) (filter (<x) src)]
where src = [2,3,4,5,8,10,11]

应该注意的是,您实际上还意味着可以被它下面的其他数字整除,而不仅仅是该列表中的任何数字,这就是为什么 all 的第二个参数中有一个 filter

结果当然是您在问题中所期望的结果:[2,3,5,11]


这是它的工作原理(如果我遗漏了什么,请告诉我,我会更新)。

我将用普通英语并排解释代码。我建议你先看英文,然后看看每个语句在代码中是如何表达的——我认为这应该是对新手最友好的。
另请注意,我在下面翻转了filterall 的参数(无效!)以使解释更加流畅。

[x|:构造一个由x组成的列表
x &lt;- src:其中x是来自src的元素
,:但只有满足以下谓词的元素/rule:
all
(filter src (&lt;x)):src 中小于当前 x
(\y -&gt; x 'rem' y /= 0) 的数字:不得产生等于 0 的余数。]

要使代码部分有意义,请确保您熟悉 allfilterrem 以及以下语法:list comprehensionslambda expressionssections 和 @ 987654327@.

【讨论】:

  • 谢谢@MasterMastic,你的解决方案很棒,你能解释一下吗?正如我告诉过你的,我是初学者
  • @riad 当然,会在几分钟内更新并随时通知您。
  • @riad 立即查看,如果您希望我扩展任何内容,请告诉我。
  • 在 GHC 上,nubBy (\a b-&gt;rem a b ==0) 可以解决问题。在兼容 Haskell98 的系统(例如 Hugs)上,使用 nubBy (\b a-&gt;rem a b ==0)。 (nubByData.List 中)。
  • 感谢@MasterMastic 的解释,非常有帮助
【解决方案2】:

在 GHC 上,

Prelude> :m + Data.List
Prelude Data.List> nubBy (\a b -> rem a b == 0) [2,3,4,5,8,10,11]
[2,3,5,11]

成功了。在兼容 Haskell98 的系统上(例如 Hugs),使用nubBy (\b a -&gt; rem a b == 0)

这个答案是posted as a commentWill Ness

【讨论】:

  • 从技术上讲,这仅在对原始列表进行排序时才有效。
  • @ØrjanJohansen,好点子!修复它的一种方法是重写 lambda,因此它总是以所需的顺序 (rem max min) 将其参数传递给 rem。但在这种情况下,解决方案并不那么性感......
【解决方案3】:

使用filter

filter :: (a -> Bool) -> [a] -> [a]

Data.Numbers.Primes函数

isPrime :: Integral int => int -> Bool

可能

filter isPrime [2, 3, 4, 5, 8, 10, 11]

或使用列表推导

[ x | x <- [2, 3, 4, 5, 8, 10, 11], isPrime x]

根据需要更改过滤谓词,例如

-- None `xs` element (different than `x`) divide `x`
noneDiv xs x = and [x `mod` y /= 0 | y <- xs, x /= y]

现在

myFilter xs = filter (noneDiv xs) xs

myFilter xs = [x | x <- xs, noneDiv xs x]

【讨论】:

  • 这与素数无关,例如如果我有 8 和 16 在列表中,我保留 8 并消除 16
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多