В списке рассылки 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)