2010-10-03 16 views
31

En la lista de correo Agda, Conor McBride preguntaron:coaccionar inseguro y el código de Agda más eficiente (-ftrust-me-im-agda)

¿Hay alguna manera de hacerse con operaciones como un putativo

trustFromJust :: Maybe x -> x 

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

Agda podría probar Quizás a == Just1 a, y el constructor intermedio para el tipo de suma podría eliminarse.

Puedo pensar en enfoques usando inseguroCorrecto # o descomprimirCierro #, 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 esto segfaults (tipos de constructor único pueden evitar parte de la tara 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) 
+0

Curiosamente, su código se ejecuta en GHCi. Aunque de hecho se segmenta al compilarlo. –

+1

Tal vez tiene 'Just' como su constructor en la segunda lista, y Just1 tiene' Just1' como primero, ¿no significa que obtendrán diferentes offsets de vector de retorno thunk? Y en cualquier caso, tener que construir una caja 'Maybe' solo para descomprimirlo parece que tendría la misma sobrecarga, independientemente de si la descomprime usando inseguroCorriente o de Just, ¿no? – mokus

+0

Si agrega un constructor ficticio delante del constructor 'Just1',' unsafeCoerce # 'no dará como resultado una segfault. No sé si esto se debe a que los offsets ahora coinciden o también porque el tipo de datos ahora también es un tipo de suma. –

Respuesta

6

ya que esta es una pregunta de investigación, tenemos algunas maneras posibles hacia adelante, pero todas se reducen a:

  • trucos Jugar con la inversión de los bits de la variable de Tal vez
Cuestiones relacionadas