Небезопасный принудительный и более эффективный код AGDA (-FTRUST-ME-IM-AGDA)

StackOverflow https://stackoverflow.com/questions/3852041

Вопрос

В списке рассылки AGDA Conor McBride спросил:

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

   trustFromJust :: Maybe x -> x

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

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

Я могу подумать о подходах, используя unsafecoerce # или раскровка #, но у кого-нибудь еще есть мысли?

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)
Это было полезно?

Решение

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

  • Играть за трюки, обращая к битам тегов, возможно,
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top