32

Agdaメーリングリストで、ConorMcBrideは次のように質問しました。

推定のような操作を手に入れる方法はありますか

   trustFromJust :: Maybe x -> x

何も与えられていない場合、これは実際には(ミルナーの意味で)Just and Goes Wrongをチェックしませんか?

Agdaは多分a==Just1 aを証明するかもしれません、そして合計型の中間コンストラクターは排除されるかもしれません。

unsafeCoerce#またはunpackClosure#を使用したアプローチを考えることができますが、他の誰かが考えていますか?

import GHC.Prim

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

data Just1 a = Just1 a

ただし、このsegfaults(単一のコンストラクタータイプは、クロージャーのオーバーヘッドの一部を回避できます)。コアは大丈夫​​に見えます:

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)
4

1 に答える 1

6

これはリサーチクエスチョンであるため、いくつかの可能な方法がありますが、それらはすべて次のようになります。

  • メイビーのタグビットを逆にしてトリックをプレイする
于 2010-10-19T23:50:40.027 に答える