Подтвердить что ты не робот

Небезопасное принуждение и более эффективный код Agda (-ftrust-me-im-agda)

В списке рассылки Agda Конор Макбрайд спросил:

есть ли способ получить операции как предполагаемый

   trustFromJust :: Maybe x -> x

который на самом деле не проверяет Just и Goes Wrong (в Milner's смысл), если ничего не кормит?

Agda может оказаться Возможно, a == Just1 a, и промежуточный конструктор для типа суммы может быть удален.

Я могу думать о подходах, использующих unsafeCoerce # или unpackClosure #, но у кого-то еще есть мысли?

import GHC.Prim

trustFromJust :: Maybe x -> x
trustFromJust x = y
    where Just1 y = unsafeCoerce# x

data Just1 a = Just1 a

хотя это segfaults (отдельные типы конструкторов могут избежать некоторых из служебных задач закрытия). Ядро выглядит нормально:

main2 =
  case (Data.Maybe.Just @ Type.Integer main3)
       `cast`
       (CoUnsafe
         (Data.Maybe.Maybe Type.Integer)
         (Just1 Type.Integer)
               :: Data.Maybe.Maybe Type.Integer
                    ~
                  Just1 Type.Integer)
  of _ { Just1 y_aeb ->
  $wshowsPrec 0 y_aeb ([] @ Char)
4b9b3361

Ответ 1

Поскольку это вопрос исследования, у нас есть несколько возможных путей вперед, но все они сводятся к следующему:

  • Воспроизведение трюков, изменяющих биты тега Maybe