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

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

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

  trustFromJust :: Maybe x -> x 
 

что на самом деле не проверяет на "Справедливо и идет не так" (в смысле Милнера ), если Ничего не кормят?

Агда может доказать Может 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)
31
задан luqui 4 October 2010 в 04:14
поделиться