-
Notifications
You must be signed in to change notification settings - Fork 72
Open
Milestone
Description
We'd expect local id == id, but this isn't true for ContT.
Let:
localTheCont :: MonadReader Int m => ContT r m ()
localTheCont = ContT $ \c -> local (+1) (c ())
test1 :: MonadReader Int m => ContT r m Int
test1 = localTheCont >> ask
test2 :: MonadReader Int m => ContT r m Int
test2 = local id localTheCont >> askthen
runReader (evalContT test1) 1 == 2
runReader (evalContT test2) 1 == 1Breaking apart the instance reveals what goes wrong:
local id localTheCont
= ContC $ \c ->
i <- ask
local id $ runContC localTheCont (local (const i) . c)
= ContC $ \c ->
i <- ask
local id $ local (+1) ((local (const i) . c) ())
= ContC $ \c ->
i <- ask
local (const i . (+1) . id) (c ())
= ContC $ \c ->
i <- ask
local (const i) (c ())Removing the instance would undoubtedly cause too much breakage, but perhaps a warning in the docs is warranted.
Metadata
Metadata
Assignees
Labels
No labels