Возможно, это глупый вопрос. Здесь цитата из документ хазотизма:
Один из подходов к решению этой проблемы - кодирование лемм, параметризованных уравнений, как функции Хаскелла. В общем, такие леммы могут быть закодированы как функции типа:
∀ x1 ... xn. Natty x1 → ... → Natty xn → ((l ~ r) ⇒ t) → t
Я думал, что понял RankNTypes
, но я не могу понять последнюю часть этого предложения. Я читаю его неофициально как "заданный термин, который требует l ~ r
, вернуть этот термин". Я уверен, что это толкование неверно, потому что это, по-видимому, приводит к округлости: мы не знаем l ~ r
до завершения самого доказательства, поэтому как можно ожидать, что мы будем рассматривать как предположение о доказательстве того термина, который требует, чтобы?
Я бы ожидал, что доказательство равенства будет иметь тип, подобный этому:
Natty x1 → ... → Natty xn → l :~: r
Неформально, "учитывая связку Natty
s, верните доказательство того, что предложения l
и r
равны" (с использованием GHC Data.Type.Equality). Это имеет для меня гораздо больше смысла и, похоже, соответствует тому, что вы скажете в других системах с навязчивой системой. Я предполагаю, что это эквивалентно версии в газете, но я изо всех сил пытаюсь скомпоновать две версии.
Короче, я в замешательстве. Я чувствую, что мне не хватает ключевого понимания. Как читать тип ((l ~ r) => t) -> t
?