如何在Racket的Plait语言中关联两个列表生成关联项列表?
解决方法
首先,你完全可以用map(Plait里用map2)来实现这个需求,make-assoc作为普通函数完全能在lambda里调用,之前的语法问题大概率是没正确使用多参数的map函数。
用多参数Map实现
Plait 版本
(map2 (lambda (key val) (make-assoc key val)) '(a b c d) '(1 2 3 4))
map2是Plait专门处理两个列表的映射函数,会依次取两个列表的对应元素,传给lambda生成make-assoc实例,最终返回目标列表。
Racket 版本
Racket的map本身支持多参数,直接用:
(map (lambda (key val) (make-assoc key val)) '(a b c d) '(1 2 3 4))
手动递归实现(不用Map)
如果想自己实现逻辑,写个递归辅助函数更直观:
(define (pair->assoc keys vals) (cond [(and (empty? keys) (empty? vals)) empty] [(or (empty? keys) (empty? vals)) (error "两个列表长度必须一致")] [else (cons (make-assoc (first keys) (first vals)) (pair->assoc (rest keys) (rest vals)))]))
调用(pair->assoc '(a b c d) '(1 2 3 4))就能得到预期结果。
关于Append的说明
append是用来拼接多个列表的,比如把'(1 2)和'(3 4)变成'(1 2 3 4),它没法帮你把两个列表的元素一一配对生成make-assoc实例,所以这个场景用不上append。
内容的提问来源于stack exchange,提问作者Phoenix
相关产品推荐
相关产品推荐

