MonadReader instance for ContT has bad semantics
- Ngôn ngữ chính
- Haskell
- Star
- 401
- Fork
- 72
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
We'd expect `local id == id`, but this isn't true for `ContT`.
Let:
```haskell
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 >> ask
```
then
```haskell
runReader (evalContT test1) 1 == 2
runReader (evalContT test2) 1 == 1
```
Breaking apart the instance reveals what goes wrong:
```haskell
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.
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
Đánh giá
Issue này chưa được đánh giá.