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)
更不精确。
我在阅读有关 '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)
更不精确。