Skip to content

Make Data.Map.insertWith' and friends consistently force the value inserted

Currently, Data.Map.insertWith' (and friends) only force the value inserted when the combining function creates it:

Prelude Data.Map> insertWith' (+) "foo" undefined empty `seq` ()
()
Prelude Data.Map> insertWith' (+) "foo" undefined (singleton "foo" 1) `seq` ()
*** Exception: Prelude.undefined

I think it would be more consistent for it to always force it:

Prelude Data.Map> insertWith' (+) "foo" undefined empty `seq` ()
*** Exception: Prelude.undefined
Prelude Data.Map> insertWith' (+) "foo" undefined (singleton "foo" 1) `seq` ()
*** Exception: Prelude.undefined

Patch:

hunk ./Data/Map.hs 460
 insertWithKey' :: Ord k => (k -> a -> a -> a) -> k -> a -> Map k a -> Map k a
 insertWithKey' f kx x t
   = case t of
-      Tip -> singleton kx x
+      Tip -> singleton kx $! x
       Bin sy ky y l r
           -> case compare kx ky of
                LT -> balance ky y (insertWithKey' f kx x l) r

Suggested discussion deadline: 14 June 2010.

Trac metadata
Trac field Value
Version 6.12.2
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component libraries (other)
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information