我有索引[Int]
和[[String]]
,现在我只想保留与索引相对应的[String]
:
[0,1,4]
和[[a,a,a],[b,b,b],[c,c,c],[d,d,d],[e,e,e],[f,f,f]]
会给[[a,a,a],[b,b,b],[e,e,e]]
所以[Int] -> [[String]] -> [[String]]
我怎么能这样做?
我试过了map (!!) (x y)
其中x是[[String]],y是[Int]
答案 0 :(得分:5)
也许你正在寻找这样的东西:
foo :: [Int] -> [[String]] -> [[String]]
foo indices strings = map (strings !!) indices
该类型也可以推广到
foo :: [Int] -> [a] -> [a]
因为我们不需要列表清单。
这不是非常有效。例如,如果我们可以假设指数正在增加,那么可以大大改善。
答案 1 :(得分:2)
我想使用列表推导是这项工作的一种富有表现力的方式。
getStrings :: [Int] -> [[String]] -> [[String]]
getStrings is css = [cs | (ix,cs) <- zip [0..] css, ix `elem` is]
*Main> gs [0,1,4] [["a","a","a"],["b","b","b"],["c","c","c"],["d","d","d"],["e","e","e"],["f","f","f"]]
[["a","a","a"],["b","b","b"],["e","e","e"]]
根据@ Centril的评论,我必须同意这里是同一个版本的monadic版本;
gs :: [Int] -> [[String]] -> [[String]]
gs is css = zip [0..] css >>= \(ix,cs) -> guard (ix `elem` is) >> return cs
*Main> gs [0,1,4] [["a","a","a"],["b","b","b"],["c","c","c"],["d","d","d"],["e","e","e"],["f","f","f"]]
[["a","a","a"],["b","b","b"],["e","e","e"]]