編輯:由David楊建議另一個版本是
findIndicesIn xs ys = findIndices (`elem` ys) xs
其中I p請參閱下面的解決方案。
如果我理解正確,你有兩個列表。打電話給他們xs
和ys
。您想在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
中的每個元素,並嘗試使用elemIndex
在xs
中找到它。爲簡潔起見,使用段語法代替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再次。
你非常接近。想一想你想給'findIndices'做什麼樣的謂詞。如果我們有'upperIndex = findIndices(\ x - > _)original',應該用什麼樣的條件替換'_'?如果這種情況是真的,那麼這意味着什麼? –
我是初學者,老實說不知道:( – Orkun