【问题标题】:Add a list to a list of lists in Haskell将列表添加到 Haskell 中的列表列表
【发布时间】:2015-10-04 10:45:43
【问题描述】:

如何将列表添加到列表列表中?假设我想将itemz 添加到bagList,这是一个列表列表。我该怎么做?

bagList itemz = mappend bagList itemz               

【问题讨论】:

    标签: list haskell monoids


    【解决方案1】:

    您可能要考虑在前面添加它,这样会更快:

    bagItem bag item = item : bag
    

    此外,您似乎来自命令式思维方式,您在 = 之前和之后使用 bagList 的方式不太正确:= 之前和之后的表达式并不真正代表相同建造。在= bagItem 被用作函数之前,= 之后它被用作一些Monoid(如果itemz 是一个列表,那么它也需要是一个列表)。

    如果你真的想追加项目(这会更慢,因为操作需要一直遍历列表以在末尾添加新项目,并且需要重新构建整个列表)你可以按照 Christoph 的建议去做,或者您可以采用如下的递归公式:

    appendItem :: a -> [a] -> [a]
    appendItem i (x:xs) = x : appendItem i xs
    appendItem i [] = i : []
    

    如果你既想追加又担心性能,你应该看看差异列表,例如在this chapter in Learn You a Haskell中查找差异列表部分。


    更新

    从 cmets 看来,您真正在寻找的是Maps。我们可以创建一个Map,其中每个项目作为键,出现次数作为值。在您的情况下,这似乎是Map String Int。

    import Data.List (foldl')
    import qualified Data.Map as M
    
    bag :: M.Map String Int
    bag = M.empty
    
    addToBag :: M.Map String Int -> [String] -> M.Map String Int
    addToBag = foldl' go
      where go m i = M.insertWith (+) i 1 m
    
    main = print $ addToBag bag ["a","b","c","a"]
    -- fromList [("a",2), ("b", 1), ("c", 1)]
    

    【讨论】:

    • 知道了。非常感谢您在上面的详细解释。所以基本上,如果我想创建一个数据结构来存储包中的项目及其编号,我可以创建类似的东西:bag :: Eq a => [a]->[a]->[a]
    • bag :: Eq a => [a]->[a]-[a] bag items nr = if null items || null nr 然后附加 bagItems [] 否则附加 bagItems 项目附加 bagItemsNr nr ?我可以做类似的事情来存储每个 bg 中的元素和项目数
    • @user9515:这听起来像是一个单独的问题。我可能不会单独存储每个集合中的项目数量,因为您冒着数字与项目集不同步的风险。毕竟,检索每个子列表中的项目数也很容易:map length bag。如果您确实想在每组项目中存储数字,我可能会选择bag :: [(Int, [a])],其中项目列表及其长度一起存储在包中。然后,您可以像这样添加项目:bagItems bag items = (length items, items) : bag.
    • 是的,但是如果我有例如:["a","b","c","c","c"] -> 例如,我想存储这个列表。我应该使用类似:bag:: [(Int,[a])] 然后调用 bagItems bag items = (length items, items) : bag 我的意思是每个包里都有不同的物品吗?如何以最快的方式存储它们?这种编程真的很新,只是出于好奇。谢谢!
    • 直到现在我还在想 bag :: Eq a => [a] -> [a] bagItems :: bag -> [] -> [[String]] bagItems bag items = ([项目长度]) ....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 2017-02-20
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多