nestable列表是说它的元素可以是列表,与之相对,把不包含列表作为元素的列表称为flat 列表。嵌套列表跟树结构类似,父节点可以包含多个子节点,每个子节点都可以是树结构,无限纵深。实际上在Scheme中常用nestable列表表示数结构,铺开(flatten)列表,也跟树的深度优先遍历类似,都是一个递归的过程。如:
sash> (my-flatten '(a (b (c d) e)))
sash> (a b c d e)
(1)自己造轮子
(define my-flatten
(lambda (ls)
(if (null? ls)
'()
(let ([h (car ls)])
(cond
[(list? h) (append (my-flatten h)
(my-flatten (cdr ls)))]
[else (cons h (my-flatten (cdr ls)))])))))
(2)使用reduce
MapReduce这几年随着Hadoop的流行而声名大噪,其思想来源于函数式编程中的map和reduce函数。在R6RS和SRFI-1中,都提供了reduce函数的两个变种:fold-left和fold-right。下面用fold-right实现:
(import (srfi 1))
(define my-flatten
(lambda (ls)
(fold-right (lambda (e a)
(if (list? e)
(append (my-flatten e) a)
(cons e a))) '() ls)))