В настоящее время я работаю над Haskell API.Последний предоставляет некоторые функции, которые в настоящее время принимают список списков в качестве входных данных, то есть [(String,[(String, Double)])]
.
Для наглядности, вот пример списка списков упомянуто выше:
[
("A", [
("I1", 1),
("I2", 2),
]
),
("B", [
("I1", 3),
]
)
]
Я определил некоторые приватные вспомогательные функции.Одна вспомогательная функция будет искать конкретные записи в этом списке (Data.List.find
= O(n)
);другой будет выполнять пересечения;а другая функция преобразует представленный выше список в следующий:
[
("I1", [
("A", 1),
("B", 3),
]
),
("I2", [
("A", 2),
]
)
]
Функция, которая выполняет преобразование, использует Data.Map
, поскольку она предлагает некоторые функции, которые значительно упрощают этот процесс, например Data.Map.unionWith
и Data.Map.insertWith
.Ну, так как функция преобразования должна вызывать Data.Map.fromList
и Data.Map.toList
, я подумал, что было бы неплохо иметь карту карт вместо списка списков с начала,И поэтому я изменил свой пример ввода в соответствии с требованием карта карт .
Опять же, для целей визуализации, вот список сверху как карта карт :
Map.fromList [
("A", Map.fromList [
("I1", 1),
("I2", 2),
]
),
("B", Map.fromList [
("I1", 3),
]
)
]
Благодаря этому шагу мой код потерял несколько строк, иблагодаря Data.Map.lookup
, поиск нужного сейчас занимает всего O(log n)
времени.
Тем не менее, я сейчас спрашиваю себя, действительно ли это хорошее решение? карта карт путь?Или функция преобразования должна работать с Data.Map.fromList
и Data.Map.toList
, а остальные должны работать с списком списков ?Или, что еще лучше, есть ли структура данных, которая больше подходит для такой работы?
Я с нетерпением жду ваших ответов.