2014-10-02 109 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