List 从两个不同大小的列表创建对列表
对Scheme来说还是个新手,我现在在创建一个由两个不同长度的单独列表构成的对列表时遇到了麻烦 这是我目前的代码:List 从两个不同大小的列表创建对列表,list,functional-programming,scheme,racket,List,Functional Programming,Scheme,Racket,对Scheme来说还是个新手,我现在在创建一个由两个不同长度的单独列表构成的对列表时遇到了麻烦 这是我目前的代码: #lang racket (define letters '(a b c)) (define (create-lst-letters lst) (map (lambda (x y) (list x y)) letters lst)) 控制台输入: (create-lst-letters '(1 2 3 4 5 6 7 8)) 电流输出: map: all lis
#lang racket
(define letters '(a b c))
(define (create-lst-letters lst)
(map (lambda (x y) (list x y)) letters lst))
控制台输入:
(create-lst-letters '(1 2 3 4 5 6 7 8))
电流输出:
map: all lists must have same size
first list length: 8
other list length: 3
想要的输出:
'((a . 1) (b . 2) (c . 3) (a . 4) (b . 5) (c . 6) (a . 7) (b . 8))
另一种直觉是得到商和输入列表长度的剩余部分除以“字母”。通过添加“字母”商倍,然后连接“字母”元素的第一个余数,创建一个新列表。使用该新列表执行如上所述的映射。我觉得这既不是一个好的做法,也不是一个优雅的解决方案,但我没有其他想法。您可以使用并简洁地生成您想要的输出
#lang racket
(define letters '(a b c))
(define (create-lst-letters lst)
(for/list ([x (in-cycle letters)] [y lst])
(cons x y)))
(create-lst-letters '(1 2 3 4 5 6 7 8))
; '((a . 1) (b . 2) (c . 3) (a . 4) (b . 5) (c . 6) (a . 7) (b . 8))
纯方案版本:
#!r7rs
(import (scheme base)
(scheme list))
(define create-lst-letters
(let ((letters (circular-list 'a 'b 'c)))
(lambda (lst)
(map cons letters lst))))
(create-lst-letters '(1 2 3 4 5 6 7 8))
; ==> ((a . 1) (b . 2) (c . 3) (a . 4) (b . 5) (c . 6) (a . 7) (b . 8))
我使用Racket,它还没有R7RS的红色版本,但thsi可以使用SRFI-1轻松重写为R6RS(与(方案列表)相同)
当然,如果您不喜欢编写Scheme代码,您可以使用#lang racket
语言编写几乎相同的代码
#lang racket
(require srfi/1)
(define create-lst-letters
(let ((letters (circular-list 'a 'b 'c)))
(lambda (lst)
(map cons letters lst))))
(create-lst-letters '(1 2 3 4 5 6 7 8))
; ==> ((a . 1) (b . 2) (c . 3) (a . 4) (b . 5) (c . 6) (a . 7) (b . 8))
有关类似问题的一些现有技术:。如果要创建一对,请使用
cons
,而不是list
。我不太明白如何将此与for/list
的文档相协调。当你使用它时,for/list
将它的序列拉在一起——这很公平。但文档中的所有示例似乎都是以其序列的笛卡尔积为例。我遗漏了什么?有for*/list
做笛卡尔积,还有for/list
做并行迭代(可以添加#:when
子句将并行迭代转换为笛卡尔积,但我的代码中并没有发生这种情况)。
#lang racket
(require srfi/1)
(define create-lst-letters
(let ((letters (circular-list 'a 'b 'c)))
(lambda (lst)
(map cons letters lst))))
(create-lst-letters '(1 2 3 4 5 6 7 8))
; ==> ((a . 1) (b . 2) (c . 3) (a . 4) (b . 5) (c . 6) (a . 7) (b . 8))