Clojure 功能组合失效
我正在研究解决这个问题的办法。我不明白为什么我的解决方案不起作用,但使用Clojure 功能组合失效,clojure,Clojure,我正在研究解决这个问题的办法。我不明白为什么我的解决方案不起作用,但使用comp的定义确实起作用。当我看到的定义,我看到: 而我的解决方案非常相似: (defn mycomp ([f] f) ([f1 f2] (fn ([] (f1 (f2))) ([a] (f1 (f2 a))) ([a & more] (f1 (apply f2 a more))) ) ) ([f1 f2 &
comp
的定义确实起作用。当我看到的定义,我看到:
而我的解决方案非常相似:
(defn mycomp
([f] f)
([f1 f2]
(fn
([] (f1 (f2)))
([a] (f1 (f2 a)))
([a & more] (f1 (apply f2 a more)))
)
)
([f1 f2 & fs]
(let [fxns (reverse (list f1 f2 fs))]
(fn [& args]
(loop [ret (apply (first fxns) args) fxns (next fxns)]
(if fxns
(recur ((first fxns) ret) (next fxns))
ret))))))
从我可以看出,两者之间的最大区别在于,第一个定义由三个或更多函数组成,而第二个定义由两个或更多函数组成
请指出我的定义有哪些地方不正确。(列表f1 f2 fs)
看起来很可疑-前两个是函数,最后一个是函数列表,因此您要创建一个包含多个对象类型的列表,然后统一处理它们。您可以使用list*
来解决这个问题
但更广泛的一点是:天哪,不要尝试做“两个或更多”的函数,只做零个或更多!没有特殊情况意味着更少的代码;clojure.core只有一堆展开的案例,以提高速度。如果你的骨架是
(fn[&fs](fn[&args]…)
,你的生活就会轻松得多。谢谢你指出列表*
的事情,我不明白列表
和列表*
之间有什么区别。此外,我使用零个或多个参数重新实现了我的解决方案,这使得代码更容易理解。再次感谢!
(defn mycomp
([f] f)
([f1 f2]
(fn
([] (f1 (f2)))
([a] (f1 (f2 a)))
([a & more] (f1 (apply f2 a more)))
)
)
([f1 f2 & fs]
(let [fxns (reverse (list f1 f2 fs))]
(fn [& args]
(loop [ret (apply (first fxns) args) fxns (next fxns)]
(if fxns
(recur ((first fxns) ret) (next fxns))
ret))))))