Доказательство того, что λ x. Ω ≠ Ω в является одной из целей, которые Абрамский ставит перед своей теорией ленивого лямбда-исчисления (страница 2 своей статьи , уже цитируемой Удаем Редди), потому что они оба находятся в нормальной форме со слабой головой. Что касается определения 2.7, он явно обсуждает, что эта-редукция λ x. M x → M, как правило, недопустимо, но это возможно, если M заканчивается в каждой среде. Это не означает, что M должна быть полной функцией - только то, что вычисление M должно завершиться (например, путем сокращения до лямбды).
Ваш вопрос, кажется, мотивирован практическими проблемами (производительность). Однако, хотя отчет по Хаскеллу может быть не совсем ясен, я сомневаюсь, что приравнивать λ x. with produce создаст полезную реализацию Haskell; реализует ли он Haskell '98 или нет, остается спорным, но, учитывая замечание, ясно, что авторы предполагали, что это так.
Наконец, как seq генерировать элементы для произвольного типа ввода? (Я знаю, что QuickCheck определяет для этого произвольный класс типов, но вы не можете добавлять такие ограничения здесь). Это нарушает параметричность.
Обновлено : мне не удалось закодировать это право (потому что я не очень бегло говорю на Хаскеле), и для исправления этого требуются вложенные runST
области. Я попытался использовать одну ячейку ссылки (в монаде ST), чтобы сохранить такие произвольные элементы, прочитать их позже и сделать их общедоступными. Параметричность доказывает, что break_parametricity
ниже не может быть определено (за исключением возврата bottom, например, ошибки), в то время как он может восстановить элементы, которые сгенерирует ваш предложенный seq.
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; но из работ Дерека Дрейера я узнал, что необходимая теория быстро разрабатывается в последние годы.
правок:
- Я даже не уверен, нужны ли вам те расширения, которые изучаются для ML-подобных, императивных и нетипизированных языков, или же классические теории параметричности охватывают Haskell.
- Кроме того, я упомянул Дерека Дрейера просто потому, что только позже я наткнулся на работу Удея Редди - я узнал об этом только недавно из «Сущности Рейнольдса». (Я только начал действительно читать литературу по параметричности в прошлом месяце или около того).