Udowadniając, że λ x. Ω ≠ Ω jest jednym z celów wyznaczonych przez Abramsky'ego dla jego leniwej teorii rachunku lambda (strona 2 jego pracy , cytowanej już przez Udaya Reddy'ego), ponieważ oba są w normalnej formie słabej głowy. Od definicji 2.7 wyraźnie dyskutuje, że eta-redukcja λ x. M x → M nie jest ogólnie poprawny, ale jest możliwe, jeśli M kończy się w każdym środowisku. Nie oznacza to, że M musi być funkcją całkowitą - tylko to, że ocena M musi się zakończyć (na przykład poprzez redukcję do lambda).
Twoje pytanie wydaje się być motywowane względami praktycznymi (wydajność). Jednak, mimo że Raport Haskella może być mniej niż całkowicie jasny, wątpię, by zrównanie λ x. Ith „z” stworzyłoby przydatną implementację Haskella; kwestia, czy implementuje Haskell '98, czy nie, jest dyskusyjna, ale biorąc pod uwagę uwagę, jasne jest, że autorzy zamierzali, aby tak było.
Wreszcie, w jaki sposób seq generuje elementy dla dowolnego typu danych wejściowych? (Wiem, że QuickCheck definiuje w tym celu typ Arbitrary, ale nie możesz tutaj dodawać takich ograniczeń). Narusza to parametryczność.
Zaktualizowano : Nie udało mi się zakodować tego poprawnie (ponieważ nie jestem tak biegły w Haskel), a naprawienie tego wymaga zagnieżdżonych runST
regionów. Próbowałem użyć pojedynczej komórki referencyjnej (w monadzie ST), aby zapisać takie dowolne elementy, przeczytać je później i uczynić je powszechnie dostępnymi. Parametryzacja dowodzi, że break_parametricity
poniżej nie można zdefiniować poniżej (z wyjątkiem zwracania wartości dolnej, np. Błędu), podczas gdy może odzyskać elementy, które wygenerowałaby proponowana sekwencja.
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
Muszę przyznać, że jestem nieco rozmyślny nad sformalizowaniem wymaganego tutaj dowodu parametrycznego, ale to nieformalne użycie parametryczności jest standardowe w Haskell; ale dowiedziałem się z pism Dereka Dreyera, że potrzebna teoria jest szybko opracowywana w ostatnich latach.
EDYCJE:
- Nie jestem nawet pewien, czy potrzebujesz tych rozszerzeń, które są badane dla języków podobnych do ML, imperatywnych i bez typów, czy też klasyczne teorie parametryczne obejmują Haskella.
- Wspomniałem też o Dereku Dreyerze tylko dlatego, że dopiero później natknąłem się na twórczość Udaya Reddy'ego - dowiedziałem się o tym dopiero niedawno z „Esencji Reynoldsa”. (Naprawdę zacząłem czytać literaturę na temat parametryczności w ostatnim miesiącu).