coaccionar inseguro y código Agda más eficiente (-ftrust-me-im-agda)
-
27-09-2019 - |
Pregunta
En la lista de correo Agda, Conor McBride preguntó:
¿hay alguna manera de hacerse operaciones como un putativo
trustFromJust :: Maybe x -> x
que en realidad no comprobar Justo y sale mal (en Milner sentido) si se alimenta Nada?
Agda podría resultar Tal vez un == Just1 una, y el constructor intermedio para el tipo suma podría ser eliminado.
No puedo pensar en enfoques que utilizan unsafeCoerce # o # unpackClosure, 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 este segfaults (tipos de constructor individuales puede evitar algunos de los gastos generales 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)
Solución
Como se trata de una pregunta de investigación, tenemos algunas maneras posibles hacia adelante, pero todas se reducen a:
- play trucos de marcha atrás los bits de etiqueta de Tal
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow