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)
War es hilfreich?

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
scroll top