coerce Unsafe e il codice Agda più efficiente (-ftrust-me-im-agda)
-
27-09-2019 - |
Domanda
Sulla mailing list Agda, Conor McBride ha chiesto:
esiste un modo per entrare in possesso di operazioni come un putativo
trustFromJust :: Maybe x -> x
, che in realtà non verificare la presenza di Basta e Va Male (a Milner di senso) se alimentato Niente?
Agda potrebbe rivelarsi Forse un == Just1 una, e il costruttore intermedio per il tipo di somma potrebbe essere eliminato.
mi viene in mente di approcci che utilizzano unsafeCoerce # o unpackClosure #, ma Qualcun altro ha pensieri?
import GHC.Prim
trustFromJust :: Maybe x -> x
trustFromJust x = y
where Just1 y = unsafeCoerce# x
data Just1 a = Just1 a
se questa segfaults (tipi unico costruttore può evitare l'overhead chiusura). Il nucleo sembra ok se:
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)
Soluzione
Poiché si tratta di una domanda di ricerca, abbiamo alcuni modi possibili in avanti, ma tutti si riduce a:
- scherzi invertendo i bit indicatori di Forse
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow