我正在使用 Clojure 学习函数式编程,并希望加深我对函数范式(不仅仅是 Clojure 的语法)的理论理解。
我要找 公理或 公式 递归、映射、归约、缺点、第一和休息等每种功能技术如何相互关联,哪些是可推导/可组合的,哪些是一切背后的最终公理。
比如我实现了map
只能使用 recur
实现, first
, rest
和 cons
函数,当然还有传递给 map
的映射函数本身.
之后我也意识到map
也可以使用 reduce
来实现,再次减少可以使用 recur
实现, first
和 rest
.还有 filter
可以用 reduce
实现.
我觉得我开始关注函数式编程,但仍然很难看出哪些是最最终的构建块,即哪些是组成任意函数的最少抽象或关键字集。对于 map 示例,第二种方法使用较少的抽象来实现相同的目标。那么,有哪些功能范式的终极公理可以帮助我了解全局?
最佳答案
从 lambda(在 clojure 中称为 fn
),您可以派生出其他任何东西。例如,让我们做派生 cons
的经典练习。 , first
, 和 rest
与 fn
:
(defn cons [x y]
(fn [f]
(f x y)))
(defn first [coll]
(coll (fn [x y] x)))
(defn rest [coll]
(coll (fn [x y] y)))
因此,如果您想要一组用于函数式编程的公理,那么只有一个:lambda 是终极公理。有关如何派生其他功能的详细信息,请参阅以下文章:
从评论中似乎对这个答案有很多困惑;我的错没有向以前没有看过的人解释。
这个想法不是要重新实现 clojure 的所有内置 first/rest 功能,这些功能是适用于各种序列的高级多态事物。相反,我们实现了三个 cons/first/rest 函数,它们协同工作以允许您通过满足以下约定来构建集合
(= x (first (cons x y)))
(= y (rest (cons x y)))
你可以只用 lambda 构建更复杂的东西,比如 clojure 的实际 first/rest,但是你必须首先发明一个完整的类型系统,所以它会涉及更多。
这是一个示例 repl session ,描述了此练习旨在演示的内容:
(defn cons [x y]
(fn [f]
(f x y)))
(defn first [coll]
(coll (fn [x y] x)))
(defn rest [coll]
(coll (fn [x y] y)))
user> (def integers (cons 0 (cons 1 (cons 2 (cons 3 nil)))))
#'user/integers
user> integers
#object[user$cons$fn__2108 0x3fb178bd "user$cons$fn__2108@3fb178bd"]
user> (first integers)
0
user> (first (rest (rest integers)))
2
关于函数式编程公理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43800459/