在类型球拍中应用构建结构
Build struct with apply in typed racket
我正在尝试在 Typed Racket 中使用 apply 构建结构列表,但无法弄清楚如何使其工作。我的猜测是它与多态函数的问题有关,但我想不出解决方法。
这个有效:
(struct tt ([a : Integer]
[b : Integer]))
(apply tt '(1 2))
但这不是(已编辑):
(struct tt2 ([a : String]
[b : (Vectorof Any)]))
(apply tt2 (list "A" (vector 1 2 2)))
出现错误:
/usr/share/racket/collects/racket/private/kw.rkt:979:25: Type Checker: Bad
arguments to function in `apply':
Domain: String (Vectorof Any)
Arguments: (List String (Vector Integer Integer Integer))
in: (#%app apply tt23 (#%app list (quote "A") (#%app vector (quote 1) (quote 2) (quote 2))))
有解决办法吗?
向量是一种可变的数据结构,向量发生变异的可能性使得类型检查变得不那么直观。
A (Vectorof Integer)
不能用作 (Vectorof Any)
,因为 (Vectorof Any)
稍后可能会发生变异以包含非整数。像这样的程序不会进行类型检查
#lang typed/racket
(struct tt2 ([a : Integer]
[b : (Vectorof Any)]))
(: v (Vectorof Integer)
(define v (vector 1 2 2))
(apply tt2 (list 1 v))
因为如果是这样,有人可以写 (vector-set! (tt2-b ....) 0 "not a number")
,然后 v
里面的类型就会错误。
解决方案是在创建向量时将每个向量注释为其正确的类型。这意味着做这些事情之一:
- 将
(vector ....)
替换为 (ann (vector ....) (Vectorof Any))
。
- 如果向量直接创建为变量
v
,将(define v (vector ....))
替换为(define v : (Vectorof Any) (vector ....))
。
例如:
#lang typed/racket
(struct tt2 ([a : Integer]
[b : (Vectorof Any)]))
(apply tt2 (list 1 (ann (vector 1 2 2) (Vectorof Any))))
请记住,这对于 可变的 事物(如向量)通常是必需的,但对于不可变的事物(如列表)则不是。
我正在尝试在 Typed Racket 中使用 apply 构建结构列表,但无法弄清楚如何使其工作。我的猜测是它与多态函数的问题有关,但我想不出解决方法。
这个有效:
(struct tt ([a : Integer]
[b : Integer]))
(apply tt '(1 2))
但这不是(已编辑):
(struct tt2 ([a : String]
[b : (Vectorof Any)]))
(apply tt2 (list "A" (vector 1 2 2)))
出现错误:
/usr/share/racket/collects/racket/private/kw.rkt:979:25: Type Checker: Bad
arguments to function in `apply':
Domain: String (Vectorof Any)
Arguments: (List String (Vector Integer Integer Integer))
in: (#%app apply tt23 (#%app list (quote "A") (#%app vector (quote 1) (quote 2) (quote 2))))
有解决办法吗?
向量是一种可变的数据结构,向量发生变异的可能性使得类型检查变得不那么直观。
A (Vectorof Integer)
不能用作 (Vectorof Any)
,因为 (Vectorof Any)
稍后可能会发生变异以包含非整数。像这样的程序不会进行类型检查
#lang typed/racket
(struct tt2 ([a : Integer]
[b : (Vectorof Any)]))
(: v (Vectorof Integer)
(define v (vector 1 2 2))
(apply tt2 (list 1 v))
因为如果是这样,有人可以写 (vector-set! (tt2-b ....) 0 "not a number")
,然后 v
里面的类型就会错误。
解决方案是在创建向量时将每个向量注释为其正确的类型。这意味着做这些事情之一:
- 将
(vector ....)
替换为(ann (vector ....) (Vectorof Any))
。 - 如果向量直接创建为变量
v
,将(define v (vector ....))
替换为(define v : (Vectorof Any) (vector ....))
。
例如:
#lang typed/racket
(struct tt2 ([a : Integer]
[b : (Vectorof Any)]))
(apply tt2 (list 1 (ann (vector 1 2 2) (Vectorof Any))))
请记住,这对于 可变的 事物(如向量)通常是必需的,但对于不可变的事物(如列表)则不是。