У меня есть список кортежей как это:
[("username", 123), ("df", 54), ("as",2 34)]
Я должен искать значение на основе имени пользователя. У меня есть поиск использования, но я должен изменить значение целого числа и записать обратно в файл. Моя логика этого должна удалить кортеж и вставить другое новое значение кортежа, а не изменить его.
Какая-либо идея, как сделать это?
Используйте 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
В ключе есть опечатка, поэтому возвращается Ничего
.
repList old new xs = map (\v@(x,y) -> if x == old then (new,y) else v) xs
Если вы используете тип Data.Map, вы можете использовать такие функции, как
updatedMap = Data.Map.updateWithKey (\_ _ -> Just 234) "username" myMap
. С тем, как вы даете свой список, вы должны построить карту примерно так:
myMap = Data.Map.fromList (map (\ (a,b) -> (b,a)) datalist)
Наконец, вы можете вернуться к списку значения с помощью Data.Map.toList.