Demostrando que λ x. Ω ≠ Ω es uno de los objetivos que Abramsky establece para su teoría del cálculo perezoso lambda (página 2 de su artículo , ya citado por Uday Reddy), porque ambos están en forma normal de cabeza débil. A partir de la definición 2.7, discute explícitamente que eta-reducción λ x. M x → M no es generalmente válido, pero es posible si M termina en todos los entornos. Esto no significa que M debe ser una función total, solo que la evaluación de M debe terminar (reduciéndose a una lambda, por ejemplo).
Su pregunta parece estar motivada por preocupaciones prácticas (rendimiento). Sin embargo, aunque el Informe Haskell podría ser menos que completamente claro, dudo que iguale λ x. ⊥ with ⊥ produciría una implementación útil de Haskell; si implementa Haskell '98 o no es discutible, pero dado el comentario, está claro que los autores pretendieron que fuera así.
Finalmente, ¿cómo seq para generar elementos para un tipo de entrada arbitraria? (Sé que QuickCheck define la clase de tipo Arbitraria para eso, pero no está permitido agregar tales restricciones aquí). Esto viola la parametricidad.
Actualizado : no logré codificar esto correctamente (porque no soy tan fluido en Haskel), y arreglar esto parece requerir runST
regiones anidadas . Intenté usar una sola celda de referencia (en la mónada ST) para guardar tales elementos arbitrarios, leerlos más tarde y hacerlos disponibles universalmente. La parametricidad demuestra que a break_parametricity
continuación no se puede definir (excepto al regresar al fondo, por ejemplo, un error), mientras que podría recuperar los elementos que generaría la secuencia propuesta.
import Control.Monad.ST
import Data.STRef
import Data.Maybe
produce_maybe_a :: Maybe a
produce_maybe_a = runST $ do { cell <- newSTRef Nothing; (\x -> writeSTRef cell (Just x) >> return x) `seq` (readSTRef cell) }
break_parametricity :: a
break_parametricity = fromJust produce_maybe_a
Tengo que admitir que estoy un poco confuso en formalizar la prueba de parametricidad necesaria aquí, pero este uso informal de la parametricidad es estándar en Haskell; pero aprendí de los escritos de Derek Dreyer que la teoría necesaria se está resolviendo rápidamente en estos últimos años.
EDICIONES:
- Ni siquiera estoy seguro de si necesita esas extensiones, que se estudian para lenguajes ML, imperativos y sin tipo, o si las teorías clásicas de parametricidad cubren Haskell.
- Además, mencioné a Derek Dreyer simplemente porque más tarde me encontré con el trabajo de Uday Reddy, lo aprendí recientemente de "La esencia de Reynolds". (Solo comencé a leer realmente literatura sobre parametricidad en el último mes más o menos).