En la lista de correo Agda, Conor McBride preguntaron:coaccionar inseguro y el código de Agda más eficiente (-ftrust-me-im-agda)
¿Hay alguna manera de hacerse con operaciones como un putativo
trustFromJust :: Maybe x -> x
que en realidad no comprobar Justo y sale mal (en el sentido de Milner) si se alimenta Nada?
Agda podría probar Quizás a == Just1 a, y el constructor intermedio para el tipo de suma podría eliminarse.
Puedo pensar en enfoques usando inseguroCorrecto # o descomprimirCierro #, pero ¿alguien más tiene pensamientos?
import GHC.Prim
trustFromJust :: Maybe x -> x
trustFromJust x = y
where Just1 y = unsafeCoerce# x
data Just1 a = Just1 a
aunque esto segfaults (tipos de constructor único pueden evitar parte de la tara de cierre). El núcleo se ve bien, aunque:
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)
Curiosamente, su código se ejecuta en GHCi. Aunque de hecho se segmenta al compilarlo. –
Tal vez tiene 'Just' como su constructor en la segunda lista, y Just1 tiene' Just1' como primero, ¿no significa que obtendrán diferentes offsets de vector de retorno thunk? Y en cualquier caso, tener que construir una caja 'Maybe' solo para descomprimirlo parece que tendría la misma sobrecarga, independientemente de si la descomprime usando inseguroCorriente o de Just, ¿no? – mokus
Si agrega un constructor ficticio delante del constructor 'Just1',' unsafeCoerce # 'no dará como resultado una segfault. No sé si esto se debe a que los offsets ahora coinciden o también porque el tipo de datos ahora también es un tipo de suma. –