不安全的强制和更高效的Agda代码(-ftrust-me-im-agda)

问题描述 投票:0回答:1

在 Agda 邮件列表上,Conor McBride 问道:

有什么办法可以拿到吗 像假设一样的操作

   trustFromJust :: Maybe x -> x

实际上并没有检查 Just 和 Goes Wrong(在 Milner 的 感觉)如果什么都不吃?

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)
haskell agda
1个回答
6
投票

由于这是一个研究问题,我们有一些可能的前进方法,但它们都归结为:

  • 玩转 Maybe 标签位的技巧
© www.soinside.com 2019 - 2024. All rights reserved.