Racket 'All' 参数化

Racket 'All' parameterization

我在阅读有关 'All' 关键字的官方 Racket 文档时感到困惑 found here

考虑示例代码:

(: list-length : (All (A) (Listof A) -> Natural))
(define (list-length lst)
  (if (null? lst)
    0
    (add1 (list-length (cdr lst)))))


(test (list-length (list 1 2 3)) => 3)
(test (list-length (list 1 2 "3")) => 3)

我希望 'All' 允许列表的多态性,同时强制列表元素为同一类型。

但是第二次测试通过了,所以我的假设显然是错误的。

我做错了什么,'All' 和 'any' 有什么区别?

(即 (All (A) (Listof A) ... )(Listof any)

您对All的理解是正确的。这里发生的是 Typed Racket 正在选择一个包含所有列表元素的类型。与 Java 或 ML 不同,Typed Racket 中的类型包括数字和字符串,例如 (U Number String),这是 Typed Racket 在这里选择的类型。

Any 类型包含所有内容,因此它比 (U Number String) 更不精确。