过滤List Haskell

时间:2014-10-02 13:03:24

标签: list haskell

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

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

3 个答案:

答案 0 :(得分:2)

[x | x <- src, all (\y -> x `rem` y /= 0) (filter (<x) src)]
where src = [2,3,4,5,8,10,11]

应该注意的是,你实际上也意味着可以通过其下面的其他数字进行分类,而不仅仅是该列表中的任何数字,这就是filter的第二个参数中有all的原因。

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


以下是它的工作原理(如果我遗漏了任何内容,请告诉我,我会更新)。

我将与普通英语并排解释代码。我建议你先阅读英文,然后看看每个陈述是如何在代码中表达的 - 我认为它对新手来说应该是最友好的。
另请注意,我将下面的filterall的参数翻转(它无效!)以使解释流畅。

[x|:构建一个由x制作的列表 x <- srcx是来自src的元素 ,:但只有满足以下谓词/规则的元素:
来自的数字all (filter src (<x))src小于当前x的{​​{1}} (\y -> x 'rem' y /= 0):不得产生等于0的余数 ]

要使代码部分有意义,请确保您已熟悉allfilterrem以及list comprehensions,{{的语法3}},lambda expressionssections

答案 1 :(得分:1)

使用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]

答案 2 :(得分:1)

关于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 -> rem a b == 0)

posted as a comment的答案是Will Ness