首页 文章

具有休息参数的类型球拍中的Zip函数

提问于
浏览
1

我正在努力解决一个将任意数量的列表压缩在一起的函数的语法 . 我目前有:

(define (zip . [lsts : (Listof Any) *]) (apply map (inst list Any) lsts))

评估时会导致以下错误:

错误:struct:exn:fail:syntax / Applications / Racket v6.6 / collectcts / racket / private / kw.rkt:929:25:Type Checker:在`apply'中运行的参数不正确:域名:( - > ab ... bc)(a的列表)(b的列表)... b( - > ac)(一对(a的列表))参数:( - >任何*(任何列表))(Listof(任何列表))* in :(#%app apply map(#%expression list)lsts)

既然这些评价还可以:

(apply map (inst list Any) '(("asd" 1 2) ("cat" 3 4))) ;;(("asd" "cat") (1 3) (2 4))

(define (test . [lsts : (Listof Any) *]) lsts) (test '(1 2 3) '(2 3 "dogs")) ;;((1 2 3) (2 3 "dogs"))

我认为类型检查器抱怨 apply 在没有传入参数时失败,因为我在尝试评估以下内容时遇到类似错误:

(apply map (inst list Any) '())

错误:struct:exn:fail:syntax / Applications / Racket v6.6 / collectcts / racket / private / kw.rkt:929:25:Type Checker:在`apply'中运行的参数不正确:域名:( - > ab ... bc)(a的列表)(b的列表)... b( - > ac)(一对(Listof a))参数:( - >任何*(Listof Any))Null * in:(#%app应用 Map (#%表达式列表)(quote()))

但我不知道如何指定函数至少需要一个参数(列表) .

1 回答

  • 2

    函数 map 需要至少使用一个列表作为参数 . 考虑如果您使用零参数调用 zip 会发生什么 . 那么你将使用零列表调用 map ,这是不允许的 . 因此,您必须限制 zip 函数以获取一个或多个参数 . 你可以通过在rest参数之前指定一个参数来做到这一点:

    #lang typed/racket
    
    (define (zip [lst : (Listof Any)] . [lsts : (Listof Any) *])
      (apply map (inst list Any) lst lsts))
    

    还有一件事:如果它是多态的,那会更好 .

    #lang typed/racket
    
    (: zip : (∀ (A) (-> (Listof A) (Listof A) * (Listof (Listof A)))))
    (define (zip lst . lsts)
      (apply map (inst list A) lst lsts))
    

    请注意,域仍然需要 (Listof A) (Listof A) * 而不仅仅是 (Listof A) * .

相关问题