for / list in typed / racket中的注释

时间:2013-08-29 14:16:36

标签: racket typed-racket

我正在尝试将类型添加到一些数字球拍代码中,希望能让它更快,但我在下面的代码中处理/ 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的类型检查器。具体来说,错误是:

  

类型检查器:宏扩展错误 - 类型信息不足以进行类型检查。请在以下内容中添加更多类型注释:(对于/ list(((ann i Index)(范围内(ann(长度xs)索引))))(if(member(list-ref xs i)ys)i -1) )

您是否可以提供注释,使其超越类型检查器和/或解释为什么这些类型注释不足?

1 个答案:

答案 0 :(得分:5)

关键是使用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对于它返回的列表的类型更聪明),我将考虑修复。