【问题标题】:Indexing with [Int] and [[String]] Haskell使用 [Int] 和 [[String]] Haskell 进行索引
【发布时间】:2018-03-04 03:24:39
【问题描述】:

我有索引[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]

【问题讨论】:

  • 请展示您自己的尝试。解释什么不起作用,等等。
  • 我已经添加了

标签: string list haskell indexing int


【解决方案1】:

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

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

类型也可以泛化为

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

因为我们不需要列表列表。

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

【讨论】:

    【解决方案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"]]
    

    【讨论】:

    • 我反对使用列表推导——它不是非常惯用的 Haskell,因为它不是组合式的。请改用 map, filter, fold, &gt;&gt;= 组合符。
    • @Centril 我认为最大化组合性并不总是谨慎的。列表推导往往非常直观易懂。有时 Python 的理想比 Haskell 的要好,即使是在编写 Haskell 时……
    • 特别是,我发现这里的一元解决方案根本不明智——它更长、更复杂,而且根本没有真正的组合性。在没有列表理解的情况下编写这个更好的方法是getStrings is = map snd . filter ((`elem`is).fst) . zip [0..]
    猜你喜欢
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多