Ticket #4109 (closed proposal: fixed)
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
Note: See
TracTickets for help on using
tickets.
