Coerção insegura e código AGDA mais eficiente (-ftrust-me-im-agda)
-
27-09-2019 - |
Pergunta
Na lista de discussão da AGDA, Conor McBride perguntou:
Existe alguma maneira de se apossar das operações como um putativo
trustFromJust :: Maybe x -> x
O que na verdade não verifica apenas e dá errado (no sentido de Milner) se não alimentou nada?
O AGDA pode provar talvez A == Just1 A, e o construtor intermediário do tipo de soma pode ser eliminado.
Eu posso pensar em abordagens usando# inseguro ou despackclosure, mas mais alguém tem pensamentos?
import GHC.Prim
trustFromJust :: Maybe x -> x
trustFromJust x = y
where Just1 y = unsafeCoerce# x
data Just1 a = Just1 a
Embora esses segfaults (tipos de construtor único possam evitar algumas das despesas gerais de fechamento). O núcleo parece bom: embora:
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)
Solução
Como essa é uma pergunta de pesquisa, temos algumas maneiras possíveis a seguir, mas todas elas se resumem a:
- Truões de jogo revertendo os bits de tags de talvez
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow