球拍'全'参数化

时间:2015-04-02 13:21:10

标签: polymorphism racket typed-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 (A) (Listof A) ... ) vs (Listof any)

1 个答案:

答案 0 :(得分:3)

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

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