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)