gpt4 book ai didi

racket - 类型化 Racket 中的自定义哈希集导致语法对象违反契约(Contract)

转载 作者:行者123 更新时间:2023-12-04 10:21:07 27 4
gpt4 key购买 nike

我有一个 custom set我想在打字 Racket 中使用它。一世
要求它使用 require/typed#:opaque custom-set?操作说明。它工作,除了代码在运行时失败,当我
调用custom-set?带有语法对象。

我有以下内容:

#lang typed/racket/base

(module UNTYPED racket/base
(require racket/set)
(provide custom-set?
make-immutable-custom-set)

(define-custom-set-types custom-set
#:elem? identifier?
(λ (id1 id2) (eq? (syntax-e id1) (syntax-e id2)))))

(require/typed 'UNTYPED
[#:opaque MySet custom-set?]
[make-immutable-custom-set ((Listof Identifier) -> MySet)])

(custom-set? (make-immutable-custom-set (list #'foo #'bar))) ;; #t
(custom-set? '()) ;; #f

哪种类型检查并返回 #t#f正如预期的那样。

现在,如果我尝试调用相同的 custom-set?带有语法对象的谓词:
(custom-set? #'(foo bar))

然后,我得到以下契约(Contract)违规而不是 #f :
custom-set?: broke its own contract
Attempted to use a higher-order value passed as `Any` in untyped code: #<syntax:stdin:: a>
in: the 1st argument of
a part of the or/c of
(or/c
struct-predicate-procedure?/c
(-> Any boolean?))
contract from: (interface for custom-set?)
blaming: (interface for custom-set?)

UNTYPED 的相同调用模块工作并返回 #f正如预期的那样。你能告诉我为什么语法对象在这里违反契约(Contract)吗?我可以解决这个问题吗?

最佳答案

这是由于语法对象契约(Contract)不够好而导致的错误。具体来说,syntax/c契约(Contract)适用于平面契约(Contract),而 Typed Racket 希望在 Any 时使用伴侣契约(Contract)。涉及类型。
Any这里涉及的是隐含的 Any#:opaque 介绍需要谓词 custom-set? .它出现在输入中,保护以类型代码开始并以非类型代码结束的值。由于未键入的代码可能会尝试与已键入的高阶值混淆,因此必须使用伴侣合约 any-wrap/c 对其进行包装。 (在 Typed Racket 内部)。
any-wrap/c是否可以保护潜在的高阶值以及可能包含高阶值的容器值。如果某个部分是可变的,或者如果某个部分中有一个函数,则不允许无类型代码改变该数据或调用该函数。

语法对象是容器。它们可以在“syntax-e”和语法属性中包含任意值。理想情况下,Typed Racket 的 any-wrap/c契约(Contract)应该将语法对象包装在保护这些地方的伴侣契约(Contract)中。不幸的是,syntax/c契约(Contract)系统中的契约(Contract)还不够好。由于这种语法,对象被认为是“不安全”的容器,如果 any-wrap/c不能安全地包装它们,它必须引发契约(Contract)错误。

我看到这个问题可能在 future 得到解决的唯一方法是改进 syntax/c与伴侣契约(Contract)一起工作。之后any-wrap/c可以将语法对象视为安全容器,就像列表一样。

关于racket - 类型化 Racket 中的自定义哈希集导致语法对象违反契约(Contract),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60842192/

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