haskell / haskell/mtl

MonadReader instance for ContT has bad semantics

Đang mở
#83 1 bình luận 0 reaction 0 người được giao Xem trên GitHub
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á.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.