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)
È stato utile?

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