球拍,应用功能列表:抽象列表功能

时间:2015-03-20 02:38:20

标签: list function scheme racket abstract

我想使用抽象列表函数创建一个函数,它将函数列表相互应用,没有起始元素(以起点为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),其中起始编号不包含在变量中。我尝试了多种代码变体,但无法使其正常工作。

2 个答案:

答案 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

链中的第一个过程(最后一个参数)以初始参数作为列表应用,因此它需要许多参数,而链的其余部分只需要一个。