Provando que λ x. Ω ≠ Ω in é um dos objetivos que Abramsky estabelece para sua teoria do cálculo preguiçoso de lambda (página 2 de seu trabalho , já citado por Uday Reddy), porque ambos estão em forma normal de cabeça fraca. Na definição 2.7, ele discute explicitamente que eta-redução λ x. M x → M geralmente não é válido, mas é possível se M terminar em todos os ambientes. Isso não significa que M deve ser uma função total - apenas que a avaliação de M deve terminar (reduzindo para um lambda, por exemplo).
Sua pergunta parece ser motivada por preocupações práticas (desempenho). No entanto, embora o Relatório Haskell possa ser menos que completamente claro, duvido que seja igual a λ x. Com ⊥ produziria uma implementação útil de Haskell; se implementa Haskell '98 ou não, é discutível, mas, dada a observação, fica claro que os autores pretendiam que fosse esse o caso.
Finalmente, como seq gerar elementos para um tipo de entrada arbitrário? (Eu sei que o QuickCheck define a classe arbitrária para isso, mas você não tem permissão para adicionar essas restrições aqui). Isso viola a parametridade.
Atualizado : não consegui codificar isso direito (porque não sou tão fluente em Haskel) e corrigir isso parece exigir runST
regiões aninhadas . Tentei usar uma única célula de referência (na mônada do ST) para salvar esses elementos arbitrários, lê-los mais tarde e disponibilizá-los universalmente. A parametridade prova que break_parametricity
abaixo não pode ser definido (exceto retornando a parte inferior, por exemplo, um erro), enquanto pode recuperar os elementos que a seq proposta geraria.
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
Devo admitir que estou um pouco confuso em formalizar a prova de parametridade necessária aqui, mas esse uso informal da parametridade é padrão em Haskell; mas aprendi com os escritos de Derek Dreyer que a teoria necessária está sendo rapidamente elaborada nos últimos anos.
Editar% s:
- Eu nem tenho certeza se você precisa dessas extensões, que são estudadas para linguagens semelhantes a ML, imperativas e não tipadas, ou se as teorias clássicas da parametridade cobrem Haskell.
- Além disso, mencionei Derek Dreyer simplesmente porque só depois me deparei com o trabalho de Uday Reddy - eu aprendi sobre isso recentemente em "A essência de Reynolds". (Só comecei a ler realmente literatura sobre parametridade no último mês).