不安全的强制和更高效的 Agda 代码 (-ftrust-me-im-agda)
-
27-09-2019 - |
题
在 Agda 邮件列表中,Conor McBride 问道:
有什么办法可以掌握诸如推定的操作
trustFromJust :: Maybe x -> x
如果什么也没喂食,哪个实际上并没有检查并出错(从米尔纳的意义上讲)?
Agda 可能会证明 Maybe a == Just1 a,并且可以消除 sum 类型的中间构造函数。
我可以想到使用 unsafeCoerce# 或 unpackClosure# 的方法,但是其他人有想法吗?
import GHC.Prim
trustFromJust :: Maybe x -> x
trustFromJust x = y
where Just1 y = unsafeCoerce# x
data Just1 a = Just1 a
尽管存在段错误(单个构造函数类型可以避免一些闭包开销)。不过核心看起来还不错:
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)
解决方案
由于这是一个研究问题,我们有几种可能的前进方法,但它们都归结为:
- 玩转 Maybe 标签位的技巧
不隶属于 StackOverflow