Я пытаюсь объединить два списка кортежей, x
и y
. В принципе, у меня есть эти списки:Алгоритм для объединения двух списков
[("hello", "hi"), ("foo", "baz"), ("this", "that")]
--and
[("foo", "bar"), ("hello", "world"), ("goo", "boo")]
--the result should be
[("hello", "world"), ("foo", "bar"), ("this", "that")]
я написал это до сих пор:
merge :: (Eq a) => [(a, b)] -> [(a, b)] -> [(a, b)]
merge [] _ = []
merge _ [] = []
merge (x:xs) (y:ys)
| fst x == fst y = (fst y, snd y) : merge xs ys
| otherwise = (fst x, snd x) : merge xs ys
Проблема с этим решением является то, что он только сливается, которые тот же индекс. Как я могу эффективно перебирать второй список и объединять его в первый?
Это композиция двух отношений. Похоже, вы основываете код на сортированном слиянии, но это действительно не похоже на слияние. См. ['Lookup'] (https://hackage.haskell.org/package/base-4.8.1.0/docs/Data-List.html#v:lookup). Для большей эффективности конвертируйте свои списки в 'Data.Map', что ближе к тому, что они представляют. – luqui
Не уверен, что я понимаю. FYI im a haskell noob. Почему я должен преобразовывать свои структуры в «Data.Map»? – dopatraman
Можете ли вы объяснить, что вы подразумеваете под «слиянием»? Вы дали небольшой пример, но это будет очень полезно выразить словами. – dfeuer