haskell / haskell/mtl

MonadReader instance for ContT has bad semantics

Abierto
#83 1 comentario 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
Haskell
Estrellas
401
Forks
72
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

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.

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.