For loop for循环中的多个绑定

For loop for循环中的多个绑定,for-loop,racket,For Loop,Racket,因此,Racket(6.5)文档说您可以一次绑定多个ID: (for ([(i j) #hash(("a" . 1) ("b" . 20))]) (display (list i j))) Bu-u-ut我想不出/找不到如何使用手动构造的数据执行此操作的示例: (define a '(1 2 3 4 5)) (define b '(10 20 30 40 50)) (for ([(i j) (map list a b)]) (display (list i j))) 爆发 r

因此,Racket(6.5)文档说您可以一次绑定多个ID:

(for ([(i j) #hash(("a" . 1) ("b" . 20))])
    (display (list i j)))
Bu-u-ut我想不出/找不到如何使用手动构造的数据执行此操作的示例:

(define a '(1 2 3 4 5))
(define b '(10 20 30 40 50))
(for ([(i j) (map list a b)])
    (display (list i j)))
爆发

result arity mismatch;
 expected number of values not received
  expected: 2
  received: 1
  from: 
  in: local-binding form
  values...:

我缺少什么?

在本例中,您可以使用单独的子句来绑定
I
j

(for ([i (list 1 2 3 4 5)]
      [j (list 10 20 30 40 50)])
  (display (list i j)))
一般来说,您可以并行使用
从多个单值序列创建多个值的单序列:

(for ([(i j) (in-parallel (list 1 2 3 4 5)
                          (list 10 20 30 40 50))])
    (display (list i j)))
这两种解决方案都打印了
(110)(220)(330)(440)(550)

(for ([(i j) #hash(("a" . 1) ("b" . 20))])
    (display (list i j)))
是的缩写

(for ([(i j) (in-hash #hash(("a" . 1) ("b" . 20)))])
    (display (list i j)))
(for ([(i j) (in-list (map list a b))])
    (display (list i j)))
现在,hash中的
一次返回两个值,因此
(ij)
将绑定到这两个值

另一方面,这:

(for ([(i j) (map list a b)])
    (display (list i j)))
是的缩写

(for ([(i j) (in-hash #hash(("a" . 1) ("b" . 20)))])
    (display (list i j)))
(for ([(i j) (in-list (map list a b))])
    (display (list i j)))
列表中的
将一次返回一个元素(在您的示例中)
元素是一个列表)。因为
(i j)
不仅是一个,还发出错误信号

同时遵循弓形虫在
中的建议

更新

下面的帮助程序
生成值序列
显示 如何创建一个自定义序列,重复 生成多个值

#lang racket

(define (make-values-sequence xss)
  ; xss is a list of (list x ...)
  (make-do-sequence (λ ()
                      (values (λ (xss) (apply values (first xss))) ;  pos->element
                              rest                                 ;  next-position
                              xss                                  ;  initial pos
                              (λ (xss) (not (empty? xss)))         ;  continue-with-pos?
                              #f                                   ;  not used
                              #f))))                               ;  not used]


(for/list ([(i j) (make-values-sequence '((1 2) (4 5) (5 6)))])
  (+ i j))
输出:

'(3 9 11)

有没有什么特别的方法可以直接编写兼容的“一次两个值的序列”(以
(列表(列表1 2)…
的方式)而不是并行地
“重新排列这两个单值序列并给我一个不透明的
#
”?