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

Ian Lynagh igloo at earth.li
Sun May 30 18:34:47 EDT 2010


Hi all,

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


Ticket: http://hackage.haskell.org/trac/ghc/ticket/4109

Suggested discussion deadline: 14 June 2010.


Thanks
Ian



More information about the Libraries mailing list