programming programing language alice compiler-construction haskell agda

compiler construction - programing - Coerción insegura y código Agda más eficiente(-ftrust-me-im-agda)



alice programing language (1)

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

¿Hay alguna manera de hacerse cargo de las operaciones como un putativo

trustFromJust :: Maybe x -> x

que en realidad no verifica Just and Goes Wrong (en el sentido de Milner) si se lo alimenta Nada?

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

Puedo pensar en enfoques que usan inseguroCuerpo # 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 individuales pueden evitar parte de la sobrecarga de cierre). Sin embargo, el núcleo se ve bien:

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)


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

  • Juega trucos para invertir los bits de etiqueta de Maybe