Unsichere coerce und effizienter Agda Code (-ftrust-me-im-agda)
-
27-09-2019 - |
Frage
Auf der Agda Mailing-Liste, Conor McBride fragte:
Gibt es eine Möglichkeit habhaft Operationen wie ein mutmaßliches
trustFromJust :: Maybe x -> x
, die eigentlich nicht für Just überprüfen und schiefgeht (in Milner Sinn), wenn gefüttert Nichts?
Agda könnte sich vielleicht ein == Just1 a, und der Zwischen Konstruktor für die Summe Typen eliminiert werden.
kann ich Ansätze denken unsafeCoerce # oder unpackClosure # verwenden, aber Hat jemand Gedanken haben?
import GHC.Prim
trustFromJust :: Maybe x -> x
trustFromJust x = y
where Just1 y = unsafeCoerce# x
data Just1 a = Just1 a
Obwohl diese segfaults (Einzel Konstruktor Typen können einige des Verschlusskopfes vermeiden). Der Kern sieht ok, aber:
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)
Lösung
Da dies eine Forschungsfrage ist, haben wir ein paar Möglichkeiten, vorwärts kam, aber sie alle kommen auf:
- Wiedergabe Tricks Umkehren des Tag-Bits von Maybe
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow