高阶函数

时间:2015-10-21 23:22:01

标签: function scheme racket higher-order-functions

给出,

reduce

列表的长度可以用(define (mylength lis) (reduce (lambda (x n) (+ 1 n)) 0 lis)). 来定义(而不是 使用从头开始的递归定义)

mymap

定义列表函数map(类似于uf),它采用一元函数lis和列表f就减少而言,即通过确定

中对应的id(mymap uf lis) = (reduce f id lis),
mymap

回想一下(mymap (lambda(x) (* 2 x)) '(1 2 3)) = (2 4 6)返回一个列表,该列表是在输入列表中的每个元素上调用函数,例如{{1}}。

对如何做到这一点的一点解释将是有帮助的,而不是一个公然的答案。谢谢。

1 个答案:

答案 0 :(得分:1)

我们有

(mymap uf lis) = (reduce f id lis) = 
 = (if (null? lis) id
     (f (car lis) (reduce f id (cdr lis))))

必须等于

 = (if null? lis) '()
     (cons (uf (car lis)) (mymap uf (cdr lis))))

匹配相应的实体,我们得到

id == '()

并且,自(mymap uf lis) = (reduce f id lis)起,它也是(mymap uf (cdr lis)) = (reduce f id (cdr lis)),所以我们有

(f x y) = (cons (uf x) y)

因此,我们定义

(define (mymap uf xs)   ; multiple `x`-es :)
  (reduce (lambda (x r)
             (cons .... r))
          '()
          xs ))

你的reduceright fold:它的组合函数接收参数列表x的元素xs,以及处理列表其余部分的递归结果,为r

r包含其余xs的所有元素,这些元素已经通过uf进行了映射。剩下要做的就是将给定元素x与此递归结果r合并,将cons (uf x)转移到r

现在通过编写实际代码代替点....来完成定义应该没有问题。