Доведення, що λ x. Ω ≠ Ω в - одна з цілей, яку Абрамський ставить для своєї лінивої теорії обчислення лямбда (стор. 2 його статті , яку вже цитував Удей Редді), оскільки вони обидва в нормальній формі слабкої голови. Щодо визначення 2.7, він чітко обговорює, що ета-зменшення λ x. M x → M, як правило, не вірно, але можливо, якщо M припиняється в будь-якому середовищі. Це не означає, що M має бути тотальною функцією - лише те, що оцінювання M повинно бути припинене (наприклад, зменшившись до лямбда).
Здається, ваше запитання мотивоване практичними проблемами (ефективністю). Однак, хоч звіт Haskell може бути менш ніж абсолютно зрозумілим, я сумніваюся, що рівняння λ x. «з» може принести корисну реалізацію Haskell; чи реалізує він Haskell '98 чи ні, є дискусійним, але, враховуючи зауваження, зрозуміло, що автори мали намір це зробити саме так.
Нарешті, як послідовно створювати елементи для довільного типу введення? (Я знаю, що QuickCheck визначає для цього довільний тип класу, але вам не дозволяється додавати сюди такі обмеження). Це порушує параметричність.
Оновлено : мені не вдалося зашифрувати це право (тому що я не так добре володію Хаскелем), і для виправлення цього, мабуть, потрібні вкладені runST
регіони. Я спробував використати єдину контрольну комірку (в монаді ST), щоб зберегти такі довільні елементи, прочитати їх згодом і зробити їх загальнодоступними. Параметричність доводить, що break_parametricity
нижче не можна визначити (за винятком повернення внизу, наприклад, помилку), в той час як вона може відновити елементи, запропоновані вами запропонованою послідовністю.
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
Я повинен визнати, що я трохи нечіткий щодо формалізації необхідного тут доказу параметрів, але це неформальне використання параметричності є стандартним у Haskell; але я дізнався з творів Дерека Дрейєра, що необхідна теорія швидко розробляється в останні останні роки.
EDIT:
- Я навіть не впевнений, чи потрібні вам такі розширення, які вивчаються для подібних до ML, імперативних та нетипових мов, чи класичні теорії параметричності охоплюють Haskell.
- Також я згадав про Дерека Дрейєра просто тому, що лише пізніше я натрапив на роботу Удая Редді - про це я дізнався лише нещодавно з "Сутності Рейнольдса". (Я почав по-справжньому читати літературу про параметричність в останній місяць або близько того).