Haskell中两个列表的比较

时间:2015-12-27 00:55:42

标签: list haskell comparison mask

我在Haskell中有两个列表。

原始列表: ["你好"," HELLO","世界"," WORLD"]

仅限大写列表: [" HELLO"," WORLD"]

你能帮我创建一个函数,它应该返回一个包含两个列表交集索引的列表。

我可以通过这样做获得第一个索引:

让upperIndex = findIndices(==(onlyUpper !! 0))原创

但是,这仅适用于一个实例,在这种情况下,我只能获得" HELLO"的索引。在原始列表中,但我希望得到所有这些。

对于此示例,答案应为: [1,3]

2 个答案:

答案 0 :(得分:0)

修改:David Young建议的另一个版本

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

我更喜欢我的解决方案。

如果我理解正确,你有两个清单。称他们为xsys。您想在xs中的每个元素的ys中找到索引。如果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中的每个元素,并尝试使用xselemIndex中找到它。使用Section语法代替flip elemIndex xs\y -> elemIndex y xs来简化。

结果是一个Maybe Int列表,代表xs中每个元素的ys中的可能的索引。请注意,如果您不跟踪缺失的元素,结果列表中索引的位置将不再对应ys中元素的位置。

你也可以使用更少的点来写这个

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

YMMV哪一个更清楚。两者都是等价的。这个版本是非常易读的IMO。你可以更进一步写下

findIndicesIn = map . flip elemIndex

但我个人认为这不太可读。 YMMV再次。

答案 1 :(得分:-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]