Единственный способ, который я знаю, чтобы влиять на поведение ~
в GHC есть на самом деле построить экземпляр a :~: b
(или аналогичный, главное, чтобы построить термин, который «доказывает» это проверки типов), а затем pattern в конструкторе Refl
, что потребует оценки свидетеля доказательства во время выполнения. Я понимаю, что текущий дизайн для зависимых типов в GHC по-прежнему потребует выполнения всех доказательств равенства типов. Тем не менее, можно использовать правила перезаписи GHC, чтобы после проверки проверки заменить доказательство свидетелем очень дешевой функцией (например, unsafeCoerce Refl :: Reverse (Reverse a) :~: a
), что сделало бы оценку очень низкой стоимостью, но все же безопасной (так как доказательство свидетеля уже было проверено, показывая, что, если он закончится, он даст правильное доказательство).
много больше информации о текущем состоянии зависимой типизации в Haskell можно найти здесь: https://typesandkinds.wordpress.com/2016/07/24/dependent-types-in-haskell-progress-report/
AFAICS, нет способа сделать это в настоящее время. Вот почему я хотел бы увидеть, что GHC однажды интегрирует проверку завершения сеанса и внутренне оптимизирует любой доказуемо завершающий 'x :: T' в' x = unsafeCoerce() ', когда' T' имеет ровно один конструктор no-args (как ' : ~: 'делает). Достаточно было бы написать доказательство по индукции, но по крайней мере не вводится штраф за выполнение. – chi
В какой-то момент должно быть более практичным использовать язык, на самом деле предназначенный для такого рода вещей ... –