过滤部分列表

时间:2014-02-26 13:55:05

标签: list haskell match

这是我的问题:我有一个这样的列表:

[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无法使其工作。

2 个答案:

答案 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)