2015-05-22 2 views

ответ

0
import qualified Data.Map as M 

mod :: (Ord k0, Ord k1) => M.Map (k0, k1) a -> [(k0, k1, a)] -> M.Map (k0, k1) a 
mod m l = M.fromList (map (\(a,b,c) -> ((a,b),c)) l) `M.union` m 

Разъяснение: возьмите свой список l троек (a,b,c) и изменить те, в ((a,b),c).

map (\(a,b,c) -> ((a,b),c)) l 

С новым списком создайте новую карту.

M.fromList (map (\(a,b,c) -> ((a,b),c)) l) 

Затем используйте M.union сращения новая карта выше и старый m:

M.fromList (map (\(a,b,c) -> ((a,b),c)) l) `M.union` m 

Поскольку M.union остается смещенным, ассоциации в левой карте имеют более высокий приоритет над теми, в правую карту, эффективно заменяя старые значения новыми.

1
mod = foldr (\(a, b, c) -> Map.insert (a, b) c) 

Идея очень проста: мы можем вставить элементы из списка по одному с помощью функции fold.

Смежные вопросы