gpt4 book ai didi

racket - 打字/ Racket 中的/列表注释

转载 作者:行者123 更新时间:2023-12-04 19:08:25 29 4
gpt4 key购买 nike

我正在尝试将类型添加到一些数字 Racket 代码中,希望能使其更快,但我在下面的代码中遇到了 for/list 宏扩展的问题。

(: index-member ((Listof Any) (Listof Any) -> (Listof Index)))
(define (index-member xs ys)
(filter-not negative?
(for/list ([(ann i Index) (in-range (ann (length xs) Index))])
(if (member (list-ref xs i) ys) i -1))))

此函数为每个 x 返回一个索引列表,它是 y 的成员。它适用于 Racket,但我似乎无法通过 Typed Racket 的类型检查器。具体来说,错误是:

Type Checker: Error in macro expansion -- insufficient type information to typecheck. please add more type annotations in: (for/list (((ann i Index) (in-range (ann (length xs) Index)))) (if (member (list-ref xs i) ys) i -1))



你能提供通过类型检查器的注释和/或解释为什么这些类型注释是不够的吗?

最佳答案

关键是使用for/list:代替表单,因为它允许您在基本 for/list 上添加类型注释。为 Typed Racket 提供更多指导的表格。我做了一些其他调整以使类型对齐(例如,使用 filter 而不是 filter-not ,避免 in-range 等):

#lang typed/racket

(: index-member ((Listof Any) (Listof Any) -> (Listof Index)))
(define (index-member xs ys)
(filter index?
(for/list: : (Listof Integer) ([i : Index (length xs)])
(if (member (list-ref xs i) ys) i -1))))

这实际上暴露了 filter-not 类型的弱点。 ( filter 关于它返回的列表类型更聪明),我会考虑修复。

关于racket - 打字/ Racket 中的/列表注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18513447/

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