
Sometimes you want to add an element, or update an existing element if one exists. You may, for example, want to store a list of values at each node in a Map, so if a key doesn't exist you add a singleton list, if the key does exist you add the new value to the list with that key. The value type is thus of a *different* type than the values that are inserted. insertWith' :: (b -> a -> a) -> (b -> a) -> k -> a -> c -> c Where the second function is used only in the "not existing" case. So the case described above could be done like so myInsert = insertWith' (:) (:[]) That is, if the key exists, the value is simply added to the front of the list, if the key doesn't exist, it's added to an empty list. This is more general than insertWith, so maybe insertWith could be defined outside the class using this... insertWith' is probably not the best name... Or... you could generalise adjust instead... adjust :: (Maybe v -> v) -> k -> c -> c myInsert k v = adjust f k where f Nothing = [v] f (Just vs) = v:vs I think I may like this better... It moves the "insertion type is different from stored type"-thing outside the type signatures... /S -- Sebastian Sylvan +46(0)736-818655 UIN: 44640862