Как добавить список в список списков? Скажем, я хочу добавить itemz
в bagList
, который является списком списков. Как я могу это сделать?Добавить список в список списков в Haskell
bagList itemz = mappend bagList itemz
Как добавить список в список списков? Скажем, я хочу добавить itemz
в bagList
, который является списком списков. Как я могу это сделать?Добавить список в список списков в Haskell
bagList itemz = mappend bagList itemz
Вы могли бы рассмотреть вопрос о включении его на фронте, это быстрее:
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.
Update
Из комментариев, кажется, что вы на самом деле ищет это Map
s. Мы можем сделать 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)]
Got It. Большое спасибо за подробное объяснение. Поэтому в основном, если я хочу создать структуру данных для хранения элементов в сумке и их номер, могу ли я создать что-то вроде: bag :: Eq a => [a] -> [a] -> [a] –
bag :: Eq a => [a] -> [a] - [a] предметы мешка nr = если нулевые предметы || null nr then append bagItems [] else append bagItems items append bagItemsNr nr? Могу ли я сделать что-то подобное для хранения элементов и номеров элементов в каждом bg –
@ user9515: Это начинает звучать как отдельный вопрос. Я бы, вероятно, не сохранил количество элементов в каждом наборе отдельно, потому что вы рискуете, что числа как-то не совпадают с наборами элементов. В конце концов, также очень легко получить количество элементов в каждом подсписке: 'map length bag'. Если вы действительно хотите сохранить номер с каждым набором элементов, я бы выбрал 'bag :: [(Int, [a])]', где списки элементов хранятся вместе с их длиной в сумке. Затем вы добавляете элементы как таковые: 'bagItems bag items = (элементы длины, предметы): bag'. –