Racket 如何将“VectorTop”的出现类型与向量'组合;s元素类型?

Racket 如何将“VectorTop”的出现类型与向量'组合;s元素类型?,racket,typed-racket,Racket,Typed Racket,这是我无法进行类型检查的函数的一个最小示例: (: int-sequence-to-vector ((Sequenceof Integer) -> (Vectorof Integer))) (define (int-sequence-to-vector seq) (cond [(vector? seq) seq] ; This line is the problem. [else (for/vector : (Vectorof Integer) ([v seq]) v)

这是我无法进行类型检查的函数的一个最小示例:

(: int-sequence-to-vector ((Sequenceof Integer) -> (Vectorof Integer)))
(define (int-sequence-to-vector seq)
  (cond
    [(vector? seq) seq] ; This line is the problem.
    [else (for/vector : (Vectorof Integer) ([v seq]) v)]))
目标是保留序列元素的类型(因此,函数范围应该是
->(Vectorof Integer)
,而不是
->Vectortop
),并使对向量的操作成为禁止操作

错误是:

Type Checker: type mismatch
  expected: (Vectorof Integer)
  given: (∩ (Sequenceof Integer) VectorTop) in: seq
我不确定
VectorTop
(任何向量的向量)
之间有什么区别,而且在我看来,
(T的序列)
也就是
VectorTop
必须是
(T的向量)

以下内容在值周围添加了一个
cast

(: int-sequence-to-vector ((Sequenceof Integer) -> (Vectorof Integer)))
(define (int-sequence-to-vector seq)
  (cond
    [(vector? seq) (cast seq (Vectorof Integer))]
    [else (for/vector : (Vectorof Integer) ([v seq]) v)]))
但这无助于:

Type Checker: Type (∩ (Sequenceof Integer) VectorTop) could not be 
converted to a contract: 
Intersection type contract contains more than 1 non-flat contract: 
(∩ (Sequenceof Integer) VectorTop) in: seq

这一点一开始可能看起来很奇怪,但情况大不相同,因为向量是可变的

如果某个东西是
(Sequenceof Integer)
,那只意味着当你从中得到一个元素时,它就是一个整数。但是类型
(整数向量)
意味着这一点以及其他一些东西。这意味着当你设置一个元素时,你可以将它设置为你想要的任何整数

(: mutate-vector-of-integer : (Vectorof Integer) -> Void)
(define (mutate-vector-of-integer voi)
  (vector-set! voi 0 -987654321))      ; can set it to any integer
因此,向量的类型检查必须比序列更严格

例如,对于序列,您可以将
(Sequenceof Byte)
传递给需要
(Sequenceof Integer)
的函数,这没有问题。即使将
(Vectorof Byte)
传递给期望
(Sequenceof Integer)
的函数也可以,但这只是因为
Sequenceof
本身不允许对序列进行变异

但是,由于可能发生变异,不允许将
(字节向量)
用作
(整数向量)
。这方面的技术术语是的向量是不变的


这也是为什么
VectorTop
不同于
(任何向量)
。类型
(任意向量)
告诉你两件事:当你得到一个元素时,它有类型
Any
,当你设置一个元素时,你可以使用
Any
。相比之下,类型
VectorTop
不提供任何“设置”信息,因此
VectorTop
本身不允许突变。

首先,谢谢!我考虑过可变性,但当我看到
vector immutable
返回不能变异的
vector
类型时,错误地排除了它。在阅读了你的答案之后,我做了更多的实验,看到了
向量集(整数向量)
上的code>被契约禁止,而不是被类型本身禁止,而变异
(∩ (Sequenceof Integer)VectorTop)
是一个类型错误,原因如您所述。有没有办法解决这个问题,让
(Vectorof Integer)
类型的值在保留其类型的同时通过示例函数?他们正在处理TR中不可变向量的类型。否则,最好的策略可能是复制向量。就像你在else案例中已经做的那样,但是你可以做一些特定于向量的事情,比如首先分配正确的长度。
(define vob : (Vectorof Byte)
  (vector 1 2 3))
(expect-vector-of-integer vob)
;Type Checker: type mismatch
;  expected: (Vectorof Integer)
;  given: (Vectorof Byte) in: vob