2015-12-27 82 views
-4

Haskell中有兩個列表。Haskell中兩個列表的比較

原版:[ 「你好」, 「你好」, 「世界」, 「世界」]

只有大寫列表:[ 「HELLO」, 「世界」]

你能幫我創建一個函數,它應該返回一個包含兩個列表相交索引的列表。

我可以這樣做,得到的第一個指標:

讓upperIndex = findIndices(==(onlyUpper !! 0))原

然而,這隻能用於一個實例,在這個我只能在原始列表中獲得「HELLO」的索引,但我想要獲得所有這些索引。

對於這個例子,答案應該是:使用的[1,3]

+0

你非常接近。想一想你想給'findIndices'做什麼樣的謂詞。如果我們有'upperIndex = findIndices(\ x - > _)original',應該用什麼樣的條件替換'_'?如果這種情況是真的,那麼這意味着什麼? –

+0

我是初學者,老實說不知道:( – Orkun

回答

0

編輯:由David楊建議另一個版本是

findIndicesIn xs ys = findIndices (`elem` ys) xs 

其中I p請參閱下面的解決方案。


如果我理解正確,你有兩個列表。打電話給他們xsys。您想在ys的每個元素中找到xs的索引。如果ys中的元素不包含在xs中,您不會提及要執行的操作,因此我將爲您選擇合理的值。那就是:

findIndicesIn :: Eq a => [a] -> [a] -> [Maybe Int] 
findIndicesIn xs ys = map (`elemIndex` xs) ys 

elemIndex :: Eq a => a -> [a] -> Maybe Int在列表中查找(與(==)比較)給定元素的索引。如果該元素不存在,則返回Nothing。要查找所有索引,我們映射ys中的每個元素,並嘗試使用elemIndexxs中找到它。爲簡潔起見,使用段語法代替flip elemIndex xs\y -> elemIndex y xs

結果是Maybe Int表示ys中的每個元素的xs的可能索引的列表。請注意,如果您不跟蹤丟失的元素,則結果列表中的索引位置將不再對應於ys中元素的位置。

您也可以作爲

findIndicesIn :: Eq a => [a] -> [a] -> [Maybe Int] 
findIndicesIn xs = map (`elemIndex` xs) 

因人而異上哪一個更明確的寫使用更少點。兩者都是相同的。這個版本是相當可讀的IMO。你可以更進一步,並寫

findIndicesIn = map . flip elemIndex 

但個人而言,我覺得這可讀性較差。 YMMV再次。

+0

那麼,爲什麼我會得到「只有1 「,」只是3「而不是1和3? – Orkun

+0

我發現它是另一種數據類型,所以我使用」map fromJust xs「將它轉換爲Int。謝謝你的回答,它的工作原理也很完美,並且縮短了很多!!! – Orkun

+0

@Orkun不要這麼做,如果在第一個列表中沒有找到元素,它會導致程序崩潰,你會得到'Just 1'和'Just 3',因爲不能保證第二個列表將在任意列表中找到,'Maybe'處理可能的失敗 –

-3
let upperIndex original onlyUpper = helper original 0 where helper [] _ = []; helper (x:xs) i = if elem x onlyUpper then i:(helper xs (i+1)) else helper xs (i+1) 

實施例:

Prelude> upperIndex ["hello", "HELLO", "world", "WORLD"] ["HELLO", "WORLD"] 
[1,3] 
+0

作品無瑕謝謝:)我不明白爲什麼人們給減。對不起,關於這個:( – Orkun

+3

這個答案應該有一個解釋爲什麼以及它是如何工作的 –

+0

噢,我明白了,但是他爲我付出了努力,我很感謝你,再一次感謝你, – Orkun