函数的Scheme运算

函数的Scheme运算,scheme,Scheme,有可能对前一个函数进行运算吗,我有一个值列表,比如1,2,3,4,5,第一个函数需要将它们乘以2,而第二个函数将前一个函数的结果加上1,所以首先我们得到2,4,6,8,10,然后是3,5,7,9,11,我得到了这个,函数g做了额外的工作,是否有可能不在元素上执行操作,而是在函数F上执行操作,或者是函数F的结果 #lang racket (define test (list 1 1 2 3 5)) (define (F) (map (lambda (element) (* 2 element

有可能对前一个函数进行运算吗,我有一个值列表,比如1,2,3,4,5,第一个函数需要将它们乘以2,而第二个函数将前一个函数的结果加上1,所以首先我们得到2,4,6,8,10,然后是3,5,7,9,11,我得到了这个,函数g做了额外的工作,是否有可能不在元素上执行操作,而是在函数F上执行操作,或者是函数F的结果

#lang racket
(define test (list 1 1 2 3 5))

(define (F)
  (map (lambda (element) (* 2 element))
       test))

(define (G)
  (map (lambda (element) (+ 1 (* 2 element)))
       test))

首先,您需要正确定义您的过程,以便在本例中使用名为lst的列表参数:

(define (F lst)
  (map (lambda (e) (* 2 e)) lst))

(define (G lst)
  (map add1 lst))
然后

或者,如果需要将两个过程结合起来:

> (G (F '(1 2 3 4 5)))
'(3 5 7 9 11)

这是对你的建议的后续行动。正如我在那里的回答中所述,您应该将正确的参数传递给函数,特别是将输入列表作为参数传递,这样您就可以使用一个函数的结果作为下一个函数的输入:

(define test (list 1 1 2 3 5))

(define (multiply-list test)
  (map (lambda (element) (* 2 element))
       test))

(define (add-list test)
  (map (lambda (element) (+ 1 element))
       test))
现在,如果我们要向输入列表中的每个元素添加一个:

(add-list test)
=> '(3 3 5 7 11)
(multiply-list test)
=> '(2 2 4 6 10)
或者,如果我们想将输入列表中的每个元素乘以2:

(add-list test)
=> '(3 3 5 7 11)
(multiply-list test)
=> '(2 2 4 6 10)
如果我们想先加一,然后乘以二,我们就可以链接函数了!其中一个的结果将成为另一个的输入,最终结果如下:

(multiply-list (add-list test))
=> '(6 6 10 14 22)
注意!您已经标记了scheme,但使用了racket语言。并非我所有的例子都适用于scheme

对!!你甚至可以在定义G时自己做,在定义G时,你加上一个值和一个乘法的结果

这是可能的链图

(map f3 (map f2 (map f1 lst)))
因此,如果您创建一个函数,该函数接受一个列表并将其加倍:

(define (list-double lst)
  (map (lambda (x) (* x 2)) lst))
您可以将其链接为四倍:

(define (list-quadruple lst)
  (list-double (list-double lst)))
现在,如果可以避免的话,链式映射不是最佳选择。相反,您可以将这些过程组合在一起:

(define (double x) (* x 2))
(define (list-quadrouple lst)
  (map (compose1 double double) lst))
这里的compose1与创建匿名函数相同,在匿名函数中链接参数。最后一个是lambda x double double x。一个更复杂的组合可以在过程之间执行多个值。例如:合成+商/余数