2014-10-19 33 views
1

我試圖使用列表理解來返回與下一個不同的列表元素。到目前爲止,我已經得到了它與模式和警衛工作,但最終需要使用列表理解Haskell - 訪問下一個元素的列表理解

因此,fn [4,3,3,1,1,3,3,3]和[4,3,1, 3]將返回[4,3,1]

這是我走到這一步,剛剛返回一個空列表

notEq'::[Int]->[Int] 
notEq' il = [x | x <- il, fn il] 
       where fn (a:b:xs) = a == b 

編輯:對這個問題展開多了,我希望它比較每個元素放在下一個元素中,並排除最後一個與[]的比較。所以[4,3,3,1]會像這樣(4,3,OK),(3,3,NO),(3,1,OK),結果[4,3]

+0

,如果你說你_want_它排除目前尚不清楚最後一個元素,或者您當前的代碼執行該操作,並且您想修復該方面。 – DaoWen 2014-10-19 03:25:50

+0

對不起,我已經澄清了 – bla9x 2014-10-19 03:32:01

回答

2

你所描述的功能和你給出的例子似乎不同意。

示例輸出表明您正在尋找一個函數,該函數接受一個列表並返回僅包含不同元素的列表。在這種情況下,你正在尋找nub

nub [4,3,3,1,1,3,3,3] 
-- result is [4,3,1] 

但是,你用英語和你的代碼描述函數接受一個列表,並刪除相鄰重複。在這種情況下,您會希望兩個示例輸入的結果都是[4,3,1,3],而不是[4,3,1]。在這種情況下,哈斯克爾已經有一個功能group子序列相鄰,相同的元素:

map head $ group [4,3,3,1,1,3,3,3] 
-- result is [4,3,1,3] 

如果必須使用的理解,這也許就足夠了:

[ x | x:xs <- group [4,3,3,1,1,3,3,3] ] 
-- result is [4,3,1,3] 

現在你已經澄清了你想要做什麼,我認爲tails將會是你的朋友在這裏:

let xs = [4,3,3,1,1,3,3,3] in 
    [ a | a:b:_ <- tails xs, a /= b ] 
-- result is [4,3,1] 

我真的不明白你爲什麼要排除最後一個元素。如果你碰巧要包括它,它會很容易適應:

let [email protected](x:_) = [4,3,3,1,1,3,3,3] in 
    x : [ b | a:b:_ <- tails xs, a /= b ] 
-- result is [4,3,1,3] 
+0

謝謝你。爲了擴大這個問題的範圍,它將每個元素與下一個元素進行比較,並且似乎將最後的比較排除在[]之外。所以[4,3,3,1]會採用這樣的結果(4,3,OK),(3,3,NO),(3,1,OK)和結果[4,3] – bla9x 2014-10-19 03:21:54

1

考慮壓縮和解與它的後繼者列表中的每個元素和過濾那些對他們的第一和第二項的不同,這樣,

notEq' :: [Int] -> [Int] 
notEq' xs = map (fst) . filter (\(a,b) -> a /= b) $ zip xs (drop 1 xs) 

爲了得到帶有標籤的列表中,考慮這個,

pairing :: Eq t => (t, t) -> (t, t, [Char]) 
pairing (x,y) = (x,y,label) 
    where 
    label = if (x /= y) then "OK" else "NO" 

map (pairing) $ zip xs (drop 1 xs) 

[4,3,3,1,1,3,3,3]將提供

[(4,3,"OK"),(3,3,"NO"),(3,1,"OK"),(1,1,"NO"),(1,3,"OK"),(3,3,"NO"),(3,3,"NO")] 

更新

使用的理解,這樣,

notEq' :: [Int] -> [Int] 
notEq' xs = [ x | (x,y) <- zip xs (drop 1 xs), x /= y ] 
相關問題