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