Небезопасный принудительный и более эффективный код Agda (-ftrust-me-im-agda)
В списке рассылки Agda Конор МакБрайд спросил:
Есть ли способ получить операции, как предполагаемый
trustFromJust :: Maybe x -> x
который на самом деле не проверяет на справедливость и идет не так (в смысле Милнера), если ничего не кормит?
Agda может доказать, что Maybe 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 ответ
Решение
Поскольку это вопрос исследования, у нас есть несколько возможных путей продвижения вперед, но все они сводятся к следующему:
- Играй трюки, поменяв местами бит тега