Список Haskell поиска кортежа

У меня есть список кортежей как это:

[("username", 123), ("df", 54), ("as",2 34)]

Я должен искать значение на основе имени пользователя. У меня есть поиск использования, но я должен изменить значение целого числа и записать обратно в файл. Моя логика этого должна удалить кортеж и вставить другое новое значение кортежа, а не изменить его.

Какая-либо идея, как сделать это?

7
задан Josh Crozier 26 May 2015 в 23:54
поделиться

3 ответа

Используйте Data.Map следующим образом:

import qualified Data.Map as Map

m1 :: Map String Int
m1 = Map.fromList [("username", 123), ("df", 54), ("as",234)]

Давайте заменим 54 на 78 (в «df»):

m2 = Map.insert "df" 78 m1

Вы можете использовать insertWith 'для объединения старых и новые значения с функцией.

Здесь мы вставляем 4 в «имя пользователя» и добавляем 4 к любому значению, на которое указывает «имя пользователя».

m3 = Map.insertWith (+) "username" 4 m1

Если вы уверены, что ключ есть на карте, вы можете получить доступ к его значению с помощью оператора (!):

import Data.Map ((!))
m3 ! "username"

Что дает 127 . Но будьте осторожны, это может вызвать исключение, если ключа нет на карте!

Для безопасного поиска:

Map.lookup :: Map k a -> k -> Maybe a
Map.lookup "usrname" m3

В ключе есть опечатка, поэтому возвращается Ничего .

15
ответ дан 6 December 2019 в 12:46
поделиться
repList old new xs = map (\v@(x,y) -> if x == old then (new,y) else v) xs
1
ответ дан 6 December 2019 в 12:46
поделиться

Если вы используете тип Data.Map, вы можете использовать такие функции, как

updatedMap = Data.Map.updateWithKey (\_ _ -> Just 234) "username" myMap

. С тем, как вы даете свой список, вы должны построить карту примерно так:

myMap = Data.Map.fromList (map (\ (a,b) -> (b,a)) datalist)

Наконец, вы можете вернуться к списку значения с помощью Data.Map.toList.

0
ответ дан 6 December 2019 в 12:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: