2017-09-22 33 views
1

我在指数[Int][[String]],现在我只是想保持其对应指数[String]索引与[INT]和[字符串]]哈斯克尔

[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是[字符串] y为[INT]

+6

请出示您自己的尝试。解释什么是行不通的等 –

+0

我已经加了 –

回答

5

也许你正在寻找的东西是这样的:

foo :: [Int] -> [[String]] -> [[String]] 
foo indices strings = map (strings !!) indices 

类型也可以推广到

foo :: [Int] -> [a] -> [a] 

因为我们不需要列表o F-名单。

这不是非常有效。例如,如果我们可以假设指数正在增加,它可以得到很大的改善。

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的评论,我必须同意这里是一个单一的版本的同一件事;

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"]] 
+0

我会反对使用列表解析 - 它不是非常习惯的Haskell,因为它不是合成的。改用'map,filter,fold,>> ='combinators。 – Centril

+0

@Centril我完全同意。让我添加一个monadic版本... – Redu

+1

@Centril我认为最大化组合性并不总是谨慎的。列表理解倾向于非常直观地理解。有时候,Python的理想比Haskell更好,即使在编写Haskell时也是如此...... – leftaroundabout