【发布时间】:2017-07-01 12:47:57
【问题描述】:
我正在为将任意数量的列表压缩在一起的函数的语法而苦苦挣扎。我目前有:
(define (zip . [lsts : (Listof Any) *])
(apply map (inst list Any) lsts))
评估时会导致以下错误:
错误:struct:exn:fail:syntax /Applications/Racket v6.6/collects/racket/private/kw.rkt:929:25:类型检查器:错误 `apply' 中函数的参数:
域:(-> a b ... b c) (Listof a) (b 列表) ... b
(-> a c) (一对a (Listof a))
参数:(-> Any * (Listof Any)) (Listof (Listof Any)) *
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/collects/racket/private/kw.rkt:929:25:类型检查器:错误 `apply' 中函数的参数:
域:(-> a b ... b c) (Listof a) (b 列表) ... b
(-> a c) (一对a (Listof a))
参数:(-> Any * (Listof Any)) Null *
in: (#%app apply map (#%expression list) (quote ()))
但我不确定如何向函数指定它至少需要一个参数(列表)。
【问题讨论】:
标签: scheme lisp racket typed-racket