我剛剛聲明學習Haskell關於過濾列表。 假設我有以下列表:[2, 3, 4, 5, 8, 10, 11]
我想只保留列表中的那些數字,這些數字不能被其他成員整除。過濾列表Haskell
我們的例子中的結果將是:[2, 3, 5, 11]
我剛剛聲明學習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