list - 普通口齿不清 : How to implement reduce

标签 list functional-programming lisp common-lisp reduce

我已经找了好几天了,基本上我需要实现一个与系统函数reduce 做同样事情的函数。这是我到目前为止所想到的,但是如果没有初始值i,我无法让它工作。

这是我的代码

(defun my-reduce (p i lista)
  (if (null lista)
       i
    (funcall p (car lista) (my-reduce p i (cdr lista)))))

顺便说一下,它甚至无法正常工作,因为它“倒退”了 例如:

(my-reduce #'list NIL '(1 2 3 4))

应该返回

(((1 2) 3) 4)

但我明白了

(1 (2 (3 (4 NIL))))

有什么想法吗?

最佳答案

左折叠可以通过简单的迭代来实现:

(defun my-fold-left (reducer initial list)
  (loop for fold = initial then (funcall reducer fold element)
        for element in list
        finally (return fold)))

例如:

(my-fold-left #'cons 0 '(1 2 3 4))
((((0 . 1) . 2) . 3) . 4)

(my-fold-left #'cons 0 '())
0

如果您使用map,您也可以概括和折叠向量:

(defun my-fold-left (reducer fold sequence)
  (map nil
       (lambda (e) (setf fold (funcall reducer fold e)))
       sequence)
  fold)

以防万一您没有阅读它,this answer对左右折叠有很好的高级解释。

关于list - 普通口齿不清 : How to implement reduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41814906/

相关文章:

lisp - 内外还原,结果一样吗?

emacs - 我的 emacs/slime 设置有什么问题(编译和加载/评估不工作)?

python - 用于检查值是否在列表中的逻辑不适用于集合

javascript - 链接和函数组合

Perl:仅打印列表中的重复值

scala - 折叠\/[A,A] 到 A

functional-programming - 你如何在 PureScript 中组合函数?

clojure - 在Clojure中,表达式的结果可以成为(def)的第一个参数吗?

python - 从项目列表创建特定形状的 Pandas 数据框

python - 找到元组对的所有可能组合,将每个组合合并成新序列