编辑:由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