coerce non sécuritaire et le code Agda plus efficace (-ftrust-me-im-agda)
-
27-09-2019 - |
Question
Sur la liste de diffusion Agda, Conor McBride a demandé:
est-il possible de se procurer opérations comme un putatif
trustFromJust :: Maybe x -> x
qui ne vérifie pas réellement Just et Goes Wrong (dans Milner sens) si fed rien?
Agda pourrait se révéler peut-être un == Just1 un, et le constructeur intermédiaire pour le type de somme pourrait être éliminé.
Je peux penser à des approches utilisant unsafeCoerce # ou # unpackClosure, mais que quelqu'un d'autre avoir des pensées?
import GHC.Prim
trustFromJust :: Maybe x -> x
trustFromJust x = y
where Just1 y = unsafeCoerce# x
data Just1 a = Just1 a
si cette segfaults (un seul type de constructeur peut éviter certains des frais généraux de fermeture). Le noyau semble ok cependant:
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)
La solution
Comme il est une question de recherche, nous avons quelques voies possibles, mais ils se résument tous en:
- jouer des tours d'inversion des bits de tag Maybe
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow