我刚刚说过学习Haskell关于过滤列表。
假设我有以下列表:[2, 3, 4, 5, 8, 10, 11]
我想只保留列表中的那些数字,这些数字不能被其他成员整除。
我们示例的结果是:[2, 3, 5, 11]
答案 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]
。
以下是它的工作原理(如果我遗漏了任何内容,请告诉我,我会更新)。
我将与普通英语并排解释代码。我建议你先阅读英文,然后看看每个陈述是如何在代码中表达的 - 我认为它对新手来说应该是最友好的。
另请注意,我将下面的filter
和all
的参数翻转(它无效!)以使解释流畅。
[x|
:构建一个由x
制作的列表
x <- src
:x
是来自src
的元素
,
:但只有满足以下谓词/规则的元素:
来自的数字all
(filter src (<x))
:src
小于当前x
的{{1}}
(\y -> x 'rem' y /= 0)
:不得产生等于0的余数
]
要使代码部分有意义,请确保您已熟悉all
,filter
,rem
以及list comprehensions,{{的语法3}},lambda expressions和sections。
答案 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)
。