我正在努力解决一个将任意数量的列表压缩在一起的函数的语法 . 我目前有:
(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 回答
函数
map
需要至少使用一个列表作为参数 . 考虑如果您使用零参数调用zip
会发生什么 . 那么你将使用零列表调用map
,这是不允许的 . 因此,您必须限制zip
函数以获取一个或多个参数 . 你可以通过在rest参数之前指定一个参数来做到这一点:还有一件事:如果它是多态的,那会更好 .
请注意,域仍然需要
(Listof A) (Listof A) *
而不仅仅是(Listof A) *
.