Ticket #4109 (closed proposal: fixed)

Opened 3 years ago

Last modified 3 years ago

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

Reported by: igloo Owned by: igloo
Priority: normal Milestone: Not GHC
Component: libraries (other) Version: 6.12.2
Keywords: Cc:
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: None/Unknown Difficulty:
Test Case: Blocked By:
Blocking: Related Tickets:

Description

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.

Change History

Changed 3 years ago by igloo

  • owner set to igloo

5 responses, all in favour of applying the patch.

Changed 3 years ago by igloo

  • status changed from new to closed
  • resolution set to fixed

Patch applied.

Note: See TracTickets for help on using tickets.