5

我正在尝试将类型添加到一些数字球拍代码中,以期使其更快,但我在下面的代码中处理 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))))

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

类型检查器:宏扩展错误——类型信息不足,无法进行类型检查。请在以下位置添加更多类型注释: (for/list (((ann i Index) (in-range (ann (length xs) Index)))) (if (member (list-ref xs i) ys) i -1) )

您能否提供通过类型检查器的注释和/或解释为什么这些类型注释不足?

4

1 回答 1

5

关键是改用for/list:表单,因为它允许您在基本for/list表单上添加类型注释,从而为 Typed Racket 提供更多指导。我进行了一些其他调整以使类型对齐(例如,使用filterover filter-not、 Avoidin-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它返回的列表类型更聪明) 类型的弱点,我将研究修复。

于 2013-08-29T15:56:38.057 回答