import Data.Map.Strict as Map keyValuesToMap :: (Eq k, Ord k, Ord v) => [(k, v)] -> Map k [v] keyValuesToMap x = keyValuesToMap_ x empty keyValuesToMap_ :: (Eq k, Ord k, Ord v) => [(k, v)] -> Map k [v] -> Map k [v] keyValuesToMap_ [] map = map keyValuesToMap_ (x:xs) map = keyValuesToMap_ xs map_ where (key, val) = x currVal = findWithDefault [] key map map_ = insert key (currVal ++ [val]) map main = do print $ keyValuesToMap [(1, "one"), (2, "two"), (1, "uno")]