Ответ 1
Единственный способ, которым я знаю повлиять на поведение ~
в GHC, - это фактически построить экземпляр a :~: b
(или аналогичный; важно построить термин, который "доказывает" это на typechecker), а затем сопоставление с образцом в конструкторе Refl
, что потребует оценки доказательства свидетеля во время выполнения. Я понимаю, что текущий дизайн для зависимых типов в GHC по-прежнему потребует выполнения всех доказательств равенства типов. Тем не менее, можно использовать правила перезаписи GHC, чтобы после проверки на проверку заменить доказательство свидетелем очень низкой стоимостью функции (например, unsafeCoerce Refl :: Reverse (Reverse a) :~: a
), что сделало бы оценку очень низкой стоимостью, но все же безопасной (поскольку свидетель доказательств уже typechecked, показывая, что если он завершится, он даст правильное доказательство).
Более подробную информацию о текущем состоянии зависимой печати в Haskell можно найти здесь: https://typesandkinds.wordpress.com/2016/07/24/dependent-types-in-haskell-progress-report/