实现基本的数组操作。
在函数式语言中,像length、map和reduce这样的数组操作非常常见。
请实现一系列基本的数组操作,不要使用现有的函数。
需要实现的操作的具体数量和名称会因你所在的编程语言轨道而异,以避免与现有名称冲突,但你将要实现的一般操作包括:
append(给定两个数组,把第二个数组中的所有元素添加到第一个数组的末尾);concatenate(给定一系列数组,把所有数组中的所有元素合并成一个扁平数组);filter(给定一个谓词和一个数组,返回所有满足 predicate(item) 为 True 的元素组成的数组);length(给定一个数组,返回其中元素的总数);map(给定一个函数和一个数组,返回对每个元素应用 function(item) 所得结果组成的数组);foldl(给定一个函数、一个数组和一个初始累加器,从左到右把每个元素折叠(归约)进累加器);foldr(给定一个函数、一个数组和一个初始累加器,从右到左把每个元素折叠(归约)进累加器);reverse(给定一个数组,返回一个包含所有原元素、但顺序相反的数组)。注意,传给折叠函数(foldl、foldr)的实参顺序很重要。
上面的说明与一个共享仓库保持同步,以确保所有语言轨道的一致性。 本附录会提供额外的说明,或根据需要修改这些说明,以便更好地契合 Clojure 轨道的目标。
在这个 Clojure 轨道的练习中,假设输入和输出都是向量,正如测试所示。 作为进阶目标,可以考虑如何实现一种不使用列表作为中间步骤的方法。
重要的是,不要复用 Clojure 已有的功能相似的内置函数,因为这样做会削弱本练习预期的学习价值。
需要避免使用的clojure.core命名空间中的关键函数包括into、concat、cat、lazy-cat、mapcat、flatten、filter、filterv、remove、count、map、mapv、reduce、transduce、reverse和rseq。
可选目标面向那些想要额外挑战的人,其设计前提是你已经完成了主要目标。
试着设计一种满足以下假设的方法来通过测试:
如果你决定发布它,请务必添加一条注释,说明它实现的是使用列表这一可选目标。 别忘了更新文档字符串!