我已经看到了other answers关于 Racket 中的压缩函数,但它们首先不太正确(zip
应该只压缩到提供的最短序列,以便您可以使用无限流进行压缩),最重要的是不是可变的,因此您可以一次只能压缩两个流。
到目前为止我已经弄清楚了
(define (zip a-sequence b-sequence) (for/stream ([a a-sequence]
[b b-sequence])
(list a b)))
它工作正常
(stream->list (zip '(a b c) (in-naturals)))
=> '((a 0) (b 1) (c 2))
但不是可变的。我知道我可以使用 define (zip .sequence)
将其定义为可变参数,但我不知道如何构建 for/stream
表单。
这必须是宏才可行吗?
最佳答案
这对你有用吗?
#lang racket
(define (my-zip . xs)
(match xs
[(list x) (for/stream ([e x]) (list e))]
[(list x xs ...)
(for/stream ([e x] [e* (apply my-zip xs)])
(cons e e*))]))
(stream->list
(my-zip (in-naturals) '(a b c) '(1 2 3 4 5 6)))
;;=> '((0 a 1) (1 b 2) (2 c 3))
关于stream - Racket 中的可变 zip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59232050/