我希望创建一个可以将两个功能合二为一的功能。给定g
and f
,它应该创建一个函数h
,将 的输出f
作为输入提供给g
。这是我的结果:
(define (compose g f)
(lambda (.args)
(g (apply f (if (atom? .args) (list .args) .args)))))
以下代码段适用于compose
.
(display ((compose add1 add1) 3))
但是,我无法弄清楚为什么下面的示例不起作用。我提供了下面的错误消息,我使用的是 Chez Scheme 9.5.2。这里的错误可能与 的可变参数性质有关compose
,但这只是一个想法。有谁知道为什么我的第二次测试没有按预期工作?
(define (reduce f lst seed)
(if (null? lst) seed
(f (car lst) (reduce f (cdr lst) seed))))
(define product-of-incremented-list
(compose
(lambda (lst) (reduce * lst 1))
(lambda (lst) (map add1 lst))))
(display (product-of-incremented-list '(3 4 5)))
; I was expecting 120, because (3 4 5) -> (4 5 6) and (4 5 6) -> 120
; I'm getting an error instead:
; Exception: incorrect number of arguments to #<procedure at compose.scm:285>