Небезопасный принудительный и более эффективный код AGDA (-FTRUST-ME-IM-AGDA)
-
27-09-2019 - |
Вопрос
В списке рассылки 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)
Решение
Поскольку это вопрос исследований, у нас есть несколько возможных путей вперед, но все они сводятся к:
- Играть за трюки, обращая к битам тегов, возможно,
Не связан с StackOverflow