Pregunta

En la lista de correo Agda, Conor McBride preguntó:

  

¿hay alguna manera de hacerse   operaciones como un putativo

   trustFromJust :: Maybe x -> x
     

que en realidad no comprobar Justo y sale mal (en Milner   sentido) si se alimenta Nada?

Agda podría resultar Tal vez un == Just1 una, y el constructor intermedio para el tipo suma podría ser eliminado.

No puedo pensar en enfoques que utilizan unsafeCoerce # o # unpackClosure, pero ¿alguien más tiene pensamientos?

import GHC.Prim

trustFromJust :: Maybe x -> x
trustFromJust x = y
    where Just1 y = unsafeCoerce# x

data Just1 a = Just1 a

Aunque este segfaults (tipos de constructor individuales puede evitar algunos de los gastos generales de cierre). El núcleo se ve bien, aunque:

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)
¿Fue útil?

Solución

Como se trata de una pregunta de investigación, tenemos algunas maneras posibles hacia adelante, pero todas se reducen a:

  • play trucos de marcha atrás los bits de etiqueta de Tal
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top