gpt4 book ai didi

compiler-errors - 不允许使用表格,因为内联记录的类型可能会转义

转载 作者:行者123 更新时间:2023-12-02 10:45:13 25 4
gpt4 key购买 nike

type 'a queue = Q of {estack : 'a list; dstack : 'a list} | Empty

let enqueue d q = match q with
| Empty -> Q {estack = [d]; dstack = []}
| _ -> Q {q with estack = q.estack :: d}

为什么编译器提示?

This form is not allowed as the type of the inlined record could escape.

最佳答案

你很可能想写一些变体

let enqueue d q = match q with  
| Empty -> Q {estack = d; dstack = []}
| Q r -> Q {r with estack = r.estack @ d}

编译器错误 This form is not allowed as the type of the inlined record could escape源于这样一个事实,即内联记录在 OCaml 中并不完全是第一类对象。特别是,它们不能在构造函数的上下文之外使用。因此,当类型检查 Q { q with … }类型检查器试图统一变量的类型 q类型为 Q -inlined record 并引发错误,因为这样的统一会泄露 Q 的内联记录到外部变量 q .

编辑:

由于您编辑的版本有完全相同的问题,这里是
修正版
let enqueue d q = match q with  
| Empty -> Q {estack = [d]; dstack = []}
| Q r -> Q {r with estack = d :: r.estack};;

和以前一样,问题在于 Q { q with … } q有类型 'a enqueue而构造函数 Q期望 'a enqueue.Q.inlined_record 类型的变量作为参数;在 OCaml 表面语言中没有明确的名称。因此需要先通过 Q r上的模式匹配来提取内部记录。然后用 Q { r with … } 更新这条记录.

关于compiler-errors - 不允许使用表格,因为内联记录的类型可能会转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42893124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com