过滤列表Haskell
我刚刚声明学习Haskell关于过滤列表。 假设我有以下列表:[2, 3, 4, 5, 8, 10, 11]
我想只保留列表中的那些数字,这些数字不能被其他成员整除。过滤列表Haskell
我们的例子中的结果将是:[2, 3, 5, 11]
[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]
。
这是它是如何工作的(如果我失去了什么,让我知道,我会更新)。
我将使用普通英语并排说明代码。我建议你先阅读英文,然后看看每个陈述是如何用代码表达的 - 我认为它应该是新手最友好的。
另请注意,我翻转了下面的参数filter
和all
(这是无效的!),以使解释变得流畅。
[x|
:建设做出来的x
x <- src
列表:凡x
为src
元素,
:但是,只有满足以下断言/规则的要素:数字all
从(filter src (<x))
:src
小于当前值x
(\y -> x 'rem' y /= 0)
:不得产生等于0的余数。]
对于代码的一部分是有道理的,确保你已经熟悉了all
,filter
,rem
,并为语法:list comprehensions,lambda expressions,sections和backticks。
谢谢@MasterMastic ,你的解决方案很好,你能向我解释一下吗?正如我告诉过你我是初学者 – riad 2014-10-02 14:42:35
@riad当然,将在几分钟内更新并保持发布。 – MasterMastic 2014-10-02 14:54:48
好的,非常感谢你 – riad 2014-10-02 14:58:46
使用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 – riad 2014-10-02 13:41:40
在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兼容的系统(例如拥抱)上,使用nubBy (\b a -> rem a b == 0)
。
这个答案是posted as a comment由。
从技术上讲,这只适用于原始列表排序。 – 2014-10-03 11:48:32
@ØrjanJohansen,好点!解决这个问题的一种方法是重写lambda,所以它总是以期望的顺序将它的参数传递给'rem'('rem max min')。但在这种情况下,解决方案并不那么性感...... – Mark 2014-10-03 11:56:23
你的意思是最小倍数 – 2014-10-02 13:05:44
而且?你尝试了什么?你卡在哪里? – Nicolas 2014-10-02 13:06:31
@VincentBeltman我在这个例子中给了更多细节,谢谢 – riad 2014-10-02 13:40:16