这是我的问题:我有一个这样的列表:
[Int]
另一个列表如下:
[[([Int], Int)]]
说列表'a'看起来像
[2,3,7,4]
和列表'b'看起来像
[([2,3,7,2],1), ([2,3,7,8],3), ([2,3], 2)]
我想首先找出是否有一个以2,3,7,4
开头的列表,但可以包含更多元素。然后我想匹配以2,3,7
开头的列表,依此类推。我想继续,直到我得到比赛。请注意,我只想匹配列表'b'中元组中的第一个元素,并忽略元组的第二个元素。
如果我不想比较列表的开头,我尝试使用filter
无法使其工作。
答案 0 :(得分:8)
进入ghci
:m + Data.List
let a = [2, 3, 7, 4]
let b = [([2, 5, 7, 4, 5], 3),([2, 3, 7, 4, 5], 5),([1, 3, 7, 4], 7)]
filter (\(xs, _) -> a `isPrefixOf` xs) b
如果没有元素匹配,并且您希望查找[2, 3, 7]
(删除最后一个元素,依此类推),那么
let f xs a = filter (\(xs, _) -> a `isPrefixOf` xs) b ++ f xs (take (length a - 1) a)
然后
head $ f b [1, 3, 7, 4, 5]
(很明显你必须检查“未找到”等不良案例,试试自己!;)
答案 1 :(得分:0)