2014-10-02 114 views
1

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

我们的例子中的结果将是:[2, 3, 5, 11]

+2

你的意思是最小倍数 – 2014-10-02 13:05:44

+1

而且?你尝试了什么?你卡在哪里? – Nicolas 2014-10-02 13:06:31

+0

@VincentBeltman我在这个例子中给了更多细节,谢谢 – riad 2014-10-02 13:40:16

回答

2
[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 <- src列表:凡xsrc元素
,:但是,只有满足以下断言/规则的要素:数字
all
(filter src (<x))src小于当前值x
(\y -> x 'rem' y /= 0):不得产生等于0的余数。
]

对于代码的一部分是有道理的,确保你已经熟悉了allfilterrem,并为语法:list comprehensionslambda expressionssectionsbackticks

+0

谢谢@MasterMastic ,你的解决方案很好,你能向我解释一下吗?正如我告诉过你我是初学者 – riad 2014-10-02 14:42:35

+0

@riad当然,将在几分钟内更新并保持发布。 – MasterMastic 2014-10-02 14:54:48

+0

好的,非常感谢你 – riad 2014-10-02 14:58:46

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] 
+0

它不是关于素数,例如,如果我有8和16名单中,我保持8和消除16 – riad 2014-10-02 13:41:40

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兼容的系统(例如拥抱)上,使用nubBy (\b a -> rem a b == 0)

这个答案是posted as a comment由​​。

+2

从技术上讲,这只适用于原始列表排序。 – 2014-10-03 11:48:32

+0

@ØrjanJohansen,好点!解决这个问题的一种方法是重写lambda,所以它总是以期望的顺序将它的参数传递给'rem'('rem max min')。但在这种情况下,解决方案并不那么性感...... – Mark 2014-10-03 11:56:23