![](/img/trans.png)
[英]Instantiate the type of the “rest” parameter of a variadic polymorphic procedure when arity is not known in advance in typed Racket
[英]Type annotating variable arity function in typed/racket
我正在尝试在 typed/racket 中键入注释以下 function。
(define (add . vals)
(apply map (lambda (x y) (+ x y)) vals))
由于 add 是一个变量 arity function,我将输入类型指定为 Any *。 由于 map function 返回结果列表,因此它的类型可能为 (Listof Any)。 所以我尝试用(: add (-> Any * (Listof Any))
注释它。
但是,类型检查器在 function 主体上失败并出现错误:
stacker.rkt:26:2: Type Checker: Bad arguments to function in `apply':
Domains: (-> a b ... b c) (Listof a) (Listof b) ... b
(-> a c) (Pairof a (Listof a))
Arguments: (case-> (-> Nonnegative-Fixnum Nonpositive-Fixnum Fixnum) (-> Nonpositive-Fixnum Nonnegative-Fixnum Fixnum) (-> Index Index Nonnegative-Fixnum) (-> Zero Number Number) (-> Number Zero Number)) (Listof Any)
in: (apply map (lambda (x y) (+ x y)) vals)
这是一个相当令人困惑的解码错误消息,我们将不胜感激对此进行推理的任何帮助。 我尝试在中运行相同的代码
就像评论中提到的 Sorawee 一样,此签名对您的代码没有任何意义。 lambda 的使用将其限制为正好两个 arguments,这两个都应该是Number
、 Real
、 Integer
、 Float
等的列表以满足+
的类型。 既然只有两个 arguments,为什么要用apply
呢? 这是一个固定版本,一个使用apply
比较一个或多个列表的版本:
(: add : (Listof Number) (Listof Number) -> (Listof Number))
(define (add l1 l2)
(map + l1 l2))
(: add-many : (Listof Number) (Listof Number) * -> (Listof Number))
(define (add-many l1 . lists)
(apply map + l1 lists))
和一些示例用法:
Language: typed/racket/base, with debugging; memory limit: 128 MB.
> (add '(1 2 3) '(4 5 6))
- : (Listof Number)
'(5 7 9)
> (add-many '(1 2 3) '(4 5 6) '(7 8 9))
- : (Listof Number)
'(12 15 18)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.