我想使用抽象列表函数创建一个函数,它将函数列表相互应用,没有起始元素(以起点为0)
所以'(列出add1 sqr add1) - > 2
到目前为止,我已经创建了一个单独的功能列表,所以对于上面的示例'(1 0 1)
有任何帮助吗?如果你可以解决一个问题,那么解释会很好,我仍然不喜欢折叠,地图等等。
(define (apply_functions lof)
(map (lambda (lof) (lof 0)) lof))
我之前已经定义了一个复合函数,如果它有用的话?
(define (composite f g)
(lambda (x) (f (g x))))
初始问题是否也可以转换为一个函数,它接受一个函数列表和一个初始数字(不是0)并产生数字结果
例如: '(add1 sqr sub1)4 - > 10
EDIT ::
所以看一下这个问题,它需要一些东西,例如(check-expect((composite-list(list add1 sqr sub1))3)5),其中起始编号不包含在变量中。我尝试了多种代码变体,但无法使其正常工作。
答案 0 :(得分:3)
这是使用foldr
的完美情况,它的行为符合预期:
(define (apply-functions lof)
(foldr (lambda (f acc) (f acc))
0
lof))
(apply-functions (list add1 sqr add1))
=> 2
这是有效的,因为我们将f
依次应用于累计结果,从0
开始。请注意foldr
以从右到左的顺序应用列表中的函数(即:应用的第一个函数是列表中的最后一个函数,然后将其结果传递给第二个 - 最后的功能等)。如果您想强制执行从左到右的订单,请使用foldl
。
对于问题的最后一部分(在编辑之后):我们可以通过将正确的参数传递给foldr
并返回一个curried函数来开始使用不同的初始数字:
(define ((composite-list lof) init)
(foldr (lambda (f acc) (f acc))
init
lof))
((composite-list (list add1 sqr sub1)) 3)
=> 5
答案 1 :(得分:0)
你甚至可以做到比这更普遍。你实际上可以制作一个通用的作品:
(define (my-compose . procedures)
(let* ((proc-in-order (reverse procedures))
(init-proc (car proc-in-order))
(remaining-procs (cdr proc-in-order)))
(lambda g
(foldl (lambda (x acc) (x acc))
(apply init-proc g)
remaining-procs))))
;; test first makes a list of it's arguments,
;; then takes the length, then negates that value
(define test (my-compose - length list))
(test 1 2 3 4) ; ==> -4
链中的第一个过程(最后一个参数)以初始参数作为列表应用,因此它需要许多参数,而链的其余部分只需要一个。