Мне нужно изменить значение на карте для нескольких ключей на заданное значение.
У меня есть этот код:
change :: Map.Map Integer Char -> [Integer] -> Char -> Map.Map Integer Char
change m ns c = foldr (\k mp -> Map.insert k c m) m ns
Меняется только первый ключ в списке. Я могу придумать другие способы сделать это, но я пытаюсь лучше понять складки.
Извините, я исправил код.
Вот сеанс ghci:
*Maps> m
fromList [(3,'?'),(5,'?'),(7,'?'),(9,'?'),(11,'?'),(13,'?'),(15,'?'),(17,'?'),(19,'?'),(21,'?'),(23,'?'),(25,'?'),(27,'?'),(29,'?')]
it :: (Ord k, Num k, Enum k) => Map.Map k Char
(0.02 secs, 149,192 bytes)
*Maps> ns
[9,15,21,27]
it :: Num a => [a]
(0.00 secs, 59,000 bytes)
*Maps> change m ns 'c'
fromList [(3,'?'),(5,'?'),(7,'?'),(9,'c'),(11,'?'),(13,'?'),(15,'?'),(17,'?'),(19,'?'),(21,'?'),(23,'?'),(25,'?'),(27,'?'),(29,'?')]
it :: Map.Map Integer Char
(0.02 secs, 149,752 bytes)
Меняется только значение 9.
Ваш код не компилируется для меня; вы точно правильно вставили? Если я переключаю параметры для лямбды:
change m ns c = foldr (\k mp -> Map.insert k c mp) m ns
или измените папку на папку:
change m ns c = foldl (\mp k -> Map.insert k c mp) m ns
код компилируется (и вставляет все ключи) в обоих направлениях.
Поскольку вы сказали, что это должно работать, я просмотрел код и нашел еще одну опечатку. В лямбде у меня было m вместо mp. Теперь это работает. Спасибо и извините за потраченное время.
Этот код типа проверяет? Похоже, параметры лямбды перевернуты