2016-06-14 3 views
15

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

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

+4

AFAICS, нет способа сделать это в настоящее время. Вот почему я хотел бы увидеть, что GHC однажды интегрирует проверку завершения сеанса и внутренне оптимизирует любой доказуемо завершающий 'x :: T' в' x = unsafeCoerce() ', когда' T' имеет ровно один конструктор no-args (как ' : ~: 'делает). Достаточно было бы написать доказательство по индукции, но по крайней мере не вводится штраф за выполнение. – chi

+5

В какой-то момент должно быть более практичным использовать язык, на самом деле предназначенный для такого рода вещей ... –

ответ

1

Единственный способ, который я знаю, чтобы влиять на поведение ~ в 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/

Смежные вопросы