2015-10-04 2 views

ответ

2

Вы могли бы рассмотреть вопрос о включении его на фронте, это быстрее:

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

Got It. Большое спасибо за подробное объяснение. Поэтому в основном, если я хочу создать структуру данных для хранения элементов в сумке и их номер, могу ли я создать что-то вроде: bag :: Eq a => [a] -> [a] -> [a] –

+0

bag :: Eq a => [a] -> [a] - [a] предметы мешка nr = если нулевые предметы || null nr then append bagItems [] else append bagItems items append bagItemsNr nr? Могу ли я сделать что-то подобное для хранения элементов и номеров элементов в каждом bg –

+0

@ user9515: Это начинает звучать как отдельный вопрос. Я бы, вероятно, не сохранил количество элементов в каждом наборе отдельно, потому что вы рискуете, что числа как-то не совпадают с наборами элементов. В конце концов, также очень легко получить количество элементов в каждом подсписке: 'map length bag'. Если вы действительно хотите сохранить номер с каждым набором элементов, я бы выбрал 'bag :: [(Int, [a])]', где списки элементов хранятся вместе с их длиной в сумке. Затем вы добавляете элементы как таковые: 'bagItems bag items = (элементы длины, предметы): bag'. –