Prouver que λ x. Ω ≠ Ω in est l'un des objectifs qu'Abramsky se fixe pour sa théorie du calcul lambda paresseux (page 2 de son article , déjà cité par Uday Reddy), car ils sont tous deux sous une forme normale de tête faible. À partir de la définition 2.7, il discute explicitement que l'éta-réduction λ x. M x → M n'est généralement pas valide, mais cela est possible si M se termine dans tous les environnements. Cela ne signifie pas que M doit être une fonction totale - seulement que l'évaluation de M doit se terminer (en réduisant par exemple à un lambda).
Votre question semble être motivée par des préoccupations pratiques (performances). Cependant, même si le rapport Haskell est loin d’être tout à fait clair, je doute que l’égalisation de λ x. ⊥ avec ⊥ produirait une implémentation utile de Haskell; si elle implémente Haskell '98 ou non est discutable, mais étant donné la remarque, il est clair que les auteurs voulaient que ce soit le cas.
Enfin, comment seq pour générer des éléments pour un type d'entrée arbitraire? (Je sais que QuickCheck définit la classe de types arbitraire pour cela, mais vous n'êtes pas autorisé à ajouter de telles contraintes ici). Cela viole la paramétricité.
Mise à jour : je n'ai pas réussi à coder ce droit (parce que je ne parle pas aussi bien Haskel), et corriger cela semble nécessiter des runST
régions imbriquées . J'ai essayé d'utiliser une seule cellule de référence (dans la monade ST) pour enregistrer ces éléments arbitraires, les lire plus tard et les rendre universellement disponibles. La paramétricité prouve que break_parametricity
ci - dessous ne peut pas être défini (sauf en retournant bottom, par exemple une erreur), alors qu'il pourrait récupérer les éléments que votre séquence proposée générerait.
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
Je dois admettre que je suis un peu flou sur la formalisation de la preuve de paramétrie nécessaire ici, mais cette utilisation informelle de la paramétrie est standard dans Haskell; mais j'ai appris des écrits de Derek Dreyer que la théorie nécessaire s'est rapidement développée au cours de ces dernières années.
MODIFICATIONS:
- Je ne sais même pas si vous avez besoin de ces extensions, qui sont étudiées pour les langages de type ML, impératifs et non typés, ou si les théories classiques de la paramétricité couvrent Haskell.
- De plus, j'ai mentionné Derek Dreyer simplement parce que je suis tombé par la suite sur le travail d'Uday Reddy - je ne l'ai appris que récemment grâce à "L'essence de Reynolds". (J'ai seulement commencé à lire de la littérature sur la paramétricité au cours du dernier mois environ).