Question

Sur la liste de diffusion Agda, Conor McBride a demandé:

  

est-il possible de se procurer   opérations comme un putatif

   trustFromJust :: Maybe x -> x
     

qui ne vérifie pas réellement Just et Goes Wrong (dans Milner   sens) si fed rien?

Agda pourrait se révéler peut-être un == Just1 un, et le constructeur intermédiaire pour le type de somme pourrait être éliminé.

Je peux penser à des approches utilisant unsafeCoerce # ou # unpackClosure, mais que quelqu'un d'autre avoir des pensées?

import GHC.Prim

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

data Just1 a = Just1 a

si cette segfaults (un seul type de constructeur peut éviter certains des frais généraux de fermeture). Le noyau semble ok cependant:

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)
Était-ce utile?

La solution

Comme il est une question de recherche, nous avons quelques voies possibles, mais ils se résument tous en:

  • jouer des tours d'inversion des bits de tag Maybe
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top