Небезопасный принудительный и эффективный код Agda (-ftrust-me-im-agda) - PullRequest
31 голосов
/ 04 октября 2010

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

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

   trustFromJust :: Maybe x -> x

, которые на самом деле не проверяютПравильно и неправильно (в смысле Милнера), если ничего не скармливать?

Агда может доказать, что может быть a == Just1 a, и промежуточный конструктор для типа sum может быть исключен.Я могу придумать подходы, использующие 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)

1 Ответ

6 голосов
/ 20 октября 2010

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

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