Ответ 1
Я предполагаю, что я поставлю этот. Я нахожу это странным вопросом, но это из-за моего собственного путешествия. Короткий ответ: не выполняйте сопоставление образцов в OTT или в любой теории типов ядер. Это не то же самое, что никогда не выполнять сопоставление шаблонов.
Длинный ответ - это в основном моя кандидатская диссертация.
В своей докторской диссертации я расскажу, как разрабатывать программы высокого уровня, написанные в стиле соответствия шаблонов, в теорию типа ядра, которая имеет только индукционные принципы для индуктивных типов данных и подходящее отношение к пропозициональному равенству. Разработка сопоставления шаблонов вводит пропозициональные уравнения по индексам типов данных, а затем решает их путем унификации. В то время я использовал интенсиональное равенство, но наблюдательное равенство дает вам хотя бы одну силу. То есть: моя технология для разработки сопоставления шаблонов (и, таким образом, сохранения ее из теории ядра), скрывающей все эквациональные свинарники, предшествует обновлению до наблюдательного равенства. Ужасный vlookup, который вы использовали для иллюстрации вашей точки, может соответствовать выходному процессу разработки, но входной сигнал не должен быть таким уж плохим. Хорошее определение
vlookup : Fin n -> Vec X n -> X
vlookup fz (vcons x xs) = x
vlookup (fs i) (vcons x xs) = vlookup i xs
развивается просто отлично. Решение уравнения, которое происходит по пути, - это то же самое решение уравнений, которое Агда делает на метауровне при проверке определения путем сопоставления с образцом или что Haskell делает. Не обманывайте себя такими программами, как
f :: a ~ b => a -> b
f x = x
В ядре Haskell, который разрабатывает какой-то
f {q} x = coerce q x
но это не в твоем лице. И это не в скомпилированном коде. Доказательства равенства OTT, такие как доказательства равенства Хаскеля, можно стереть перед вычислением с замкнутыми членами.
Отступление. Чтобы быть понятным о статусе данных равенства в Haskell, GADT
data Eq :: k -> k -> * where
Refl :: Eq x x
действительно дает вам
Refl :: x ~ y -> Eq x y
но поскольку система типов не является логически звуковой, тип безопасности зависит от строгого соответствия шаблонов в этом типе: вы не можете стереть Refl
, и вы действительно должны вычислить его и сопоставить его во время выполнения, но вы можете стереть данные, соответствующие доказательству x~y
. В OTT весь пропозициональный фрагмент является доказательством, не имеющим отношения к открытым терминам и стираемым для закрытых вычислений. Конец отступления.
Разрешимость равенства по тому или иному типу данных не имеет особого значения (по крайней мере, если у вас есть уникальность доказательств идентичности, если у вас не всегда есть UIP, разрешимость - это один из способов получить его иногда). Эквациональные проблемы, возникающие при сопоставлении шаблонов, относятся к произвольным открытым выражениям. Это много веревки. Но машина, безусловно, может решить фрагмент, состоящий из выражений первого порядка, построенных из переменных и полностью применяемых конструкторов (и того, что делает Agda при раздельном случае: если ограничения слишком странные, вещь просто barfs). OTT должен позволить нам немного продвинуться в разрешимые фрагменты унификации высшего порядка. Если вы знаете (forall x. f x = t[x])
для неизвестного f
, что эквивалентно f = \ x -> t[x]
.
Таким образом, "отсутствие сопоставления шаблонов в OTT" всегда было преднамеренным выбором дизайна, поскольку мы всегда намеревались стать целью разработки для перевода, который мы уже знали, как это сделать. Скорее, это строгое обновление в теории ядра.