用于/列出类型/球拍中的注释

wdk*_*nls 5 racket typed-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))))
Run Code Online (Sandbox Code Playgroud)

此函数返回x的索引列表,每个x是y的成员。它可以在球拍中使用,但是我似乎无法通过Typed Racket的类型检查器。具体来说,错误是:

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

您是否可以提供注释,以克服类型检查器的问题和/或解释为什么这些类型注释不足?

Asu*_*awa 5

关键是改用for/list:表单,因为它允许您在基本for/list表单上添加类型注释,从而为Typed Racket提供更多指导。我进行了一些其他调整以使类型对齐(例如,使用filterover 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))))
Run Code Online (Sandbox Code Playgroud)

这实际上暴露了类型的弱点filter-notfilter对于返回的列表类型更聪明),我将对其进行修复。

  • for / list:实际上是不推荐使用的形式-标准的for / list可以用类型信息进行注释。请参阅http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._for%29 %29 (2认同)