Информирование Haskell о том, что `(Обратный (Обратный xs)) ~ xs`

Если Reverse :: [k] -> [k] - это семейство типов, то Haskell не может сказать, что (Reverse (Reverse xs)) ~ xs. Есть ли способ, чтобы система типов знала об этом без каких-либо затрат времени выполнения?

У меня возникает соблазн просто использовать unsafeCoerce, но это кажется позором.

Ответы

Ответ 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/