Dimostrando che λ x. Ω ≠ Ω in è uno degli obiettivi che Abramsky stabilisce per la sua pigra teoria del calcolo lambda (pagina 2 di suo articolo , già citato da Uday Reddy), perché entrambi sono in forma normale testa debole. A partire dalla definizione 2.7, discute esplicitamente che la riduzione dell'et λ x. M x → M non è generalmente valido, ma è possibile se M termina in ogni ambiente. Ciò non significa che M debba essere una funzione totale, ma solo che la valutazione di M deve terminare (riducendo ad esempio una lambda).
La tua domanda sembra essere motivata da preoccupazioni pratiche (prestazioni). Tuttavia, anche se il Rapporto Haskell potrebbe essere meno del tutto chiaro, dubito che equiparare λ x. con ⊥ produrrebbe un'utile attuazione di Haskell; se si implementi o meno Haskell '98 è discutibile, ma data l'osservazione, è chiaro che gli autori lo intendevano.
Infine, come fa seq a generare elementi per un tipo di input arbitrario? (So che QuickCheck definisce la tabella dei tipi arbitraria per questo, ma non ti è permesso aggiungere tali vincoli qui). Questo viola la parametricità.
Aggiornato : non sono riuscito a codificare questo diritto (perché non ho una conoscenza fluente di Haskel) e la correzione sembra richiedere runST
aree nidificate . Ho provato a usare una singola cella di riferimento (nella monade ST) per salvare tali elementi arbitrari, leggerli in seguito e renderli universalmente disponibili. La parametricità dimostra che break_parametricity
non è possibile definire di seguito (tranne restituendo bottom, ad esempio un errore), mentre potrebbe recuperare gli elementi generati dal seq proposto.
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 ammettere che sono leggermente confuso nel formalizzare la prova di parametricità necessaria qui, ma questo uso informale della parametricità è standard in Haskell; ma ho imparato dagli scritti di Derek Dreyer che la teoria necessaria è stata rapidamente elaborata in questi ultimi anni.
modifiche:
- Non sono nemmeno sicuro che tu abbia bisogno di quelle estensioni, che sono studiate per linguaggi di tipo ML, imperativi e non tipizzati, o se le teorie classiche della parametricità coprono Haskell.
- Inoltre, ho citato Derek Dreyer semplicemente perché mi sono imbattuto solo in seguito nel lavoro di Uday Reddy - ne ho appreso solo recentemente da "L'essenza di Reynolds". (Ho iniziato a leggere davvero letteratura sulla parametricità solo nell'ultimo mese).