Scheme 球拍中地图值的推广
假设我有以下函数:Scheme 球拍中地图值的推广,scheme,racket,functor,multiple-return-values,Scheme,Racket,Functor,Multiple Return Values,假设我有以下函数: (define foo (lambda (n) (values n (* 2 n)))) (define map-values (lambda (f xs) (match xs ['() (values '() '())] [(cons x xs) (let-values ([(a b) (f x)] [(as bs) (map-values f xs)])
(define foo
(lambda (n)
(values n (* 2 n))))
(define map-values
(lambda (f xs)
(match xs
['() (values '() '())]
[(cons x xs)
(let-values ([(a b) (f x)]
[(as bs) (map-values f xs)])
(values (cons a as) (cons b bs)))]
)))
我想在列表中调用mapfoo
(1234)。因此,我创建了一个映射值的函数:
(define foo
(lambda (n)
(values n (* 2 n))))
(define map-values
(lambda (f xs)
(match xs
['() (values '() '())]
[(cons x xs)
(let-values ([(a b) (f x)]
[(as bs) (map-values f xs)])
(values (cons a as) (cons b bs)))]
)))
现在,我可以做以下工作:
(map-values foo '(1 2 3 4)) => (values '(1 2 3 4) '(2 4 6 8))
但是,如果foo
返回三个值,或者四个。。。等我需要为每种情况创建一个新的映射值
函数。有没有一种方法可以通用化映射值
,以便Is可以处理任何返回多个值的foo
(定义(映射值过程lst)
(定义(环绕e)
(使用值调用(lambda()(proc e))列表)
(应用值)
(应用地图列表(地图换行列表)))
(定义(foo n)
(数值n(*2N)(/1N)))
(映射值foo'(1 2 3 4))
; ==> (1 2 3 4)
; ==> (2 4 6 8)
; ==> (1 1/2 1/3 1/4)
这也与标准方案兼容