Beweis, dass λ x. Ω ≠ Ω in ist eines der Ziele, die Abramsky sich für seine Theorie der faulen Lambda-Rechnung setzt (Seite 2 seiner Arbeit) , die bereits von Uday Reddy zitiert wurde) setzt, weil beide in normaler Schwachkopfform vorliegen. Ab Definition 2.7 diskutiert er explizit die eta-Reduktion λ x. M x → M ist nicht allgemein gültig, aber es ist möglich, wenn M in jeder Umgebung endet. Dies bedeutet nicht, dass M eine Gesamtfunktion sein muss - nur, dass die Auswertung von M enden muss (z. B. durch Reduzieren auf ein Lambda).
Ihre Frage scheint von praktischen Bedenken (Leistung) motiviert zu sein. Obwohl der Haskell-Bericht möglicherweise nicht ganz klar ist, bezweifle ich, dass λ x gleichgesetzt wird. ⊥ mit ⊥ würde eine nützliche Implementierung von Haskell ergeben; ob es Haskell '98 implementiert oder nicht, ist umstritten, aber angesichts der Bemerkung ist klar, dass die Autoren beabsichtigten, dass dies der Fall ist.
Schließlich, wie ist es, Elemente für einen beliebigen Eingabetyp zu generieren? (Ich weiß, dass QuickCheck die Arbitrary-Typenklasse dafür definiert, aber Sie dürfen hier keine solchen Einschränkungen hinzufügen.) Dies verletzt die Parametrizität.
Aktualisiert : Ich habe es nicht geschafft, dieses Recht zu codieren (weil ich nicht so fließend in Haskel bin), und um dies zu beheben, sind anscheinend verschachtelte runST
Regionen erforderlich . Ich habe versucht, mit einer einzelnen Referenzzelle (in der ST-Monade) solche beliebigen Elemente zu speichern, sie später zu lesen und universell verfügbar zu machen. Die Parametrizität beweist, dass das break_parametricity
Folgende nicht definiert werden kann (außer durch Zurückgeben von bottom, z. B. eines Fehlers), während die Elemente wiederhergestellt werden könnten, die die vorgeschlagene Folge erzeugen würde.
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
Ich muss zugeben, dass ich die Formalisierung des hier benötigten Parametrizitätsnachweises ein wenig unklar finde, aber diese informelle Verwendung von Parametrizität ist in Haskell Standard. aber ich habe aus Derek Dreyers Schriften gelernt, dass die nötige Theorie in den letzten Jahren schnell ausgearbeitet wird.
EDITs:
- Ich bin mir nicht einmal sicher, ob Sie diese Erweiterungen benötigen, die für ML-artige, imperative und untypisierte Sprachen studiert wurden, oder ob die klassischen Theorien der Parametrizität Haskell abdecken.
- Außerdem habe ich Derek Dreyer erwähnt, weil ich erst später auf Uday Reddys Werk gestoßen bin - das habe ich erst kürzlich aus "The essence of Reynolds" erfahren. (Ich habe erst im letzten Monat angefangen, Literatur über Parametrizität zu lesen).