繁体   English   中英

在 typed/racket 中键入注释变量 arity function

[英]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,这两个都应该是NumberRealIntegerFloat等的列表以满足+的类型。 既然只有两个 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM