Y-Combinator不同语言实现方案

简介:

递归和定点

纯λ演算的一大特色是可以通过使用一种自应用技巧来书写递归函数。

f(n) = if n = 0 then 1 else n*f(n-1) 
f = λn.if n = 0 then 1 else n*f(n-1)

把f移到等式的后面,得到函数G

G = λf.λn.if n = 0 then 1 else n*f(n-1)

很显然有:

f = G(f)

这表明递归声明涉及找出定点。 函数G的定点是指满足f=G(f)的f的值。在λ演算中,定点由定点操作符Y来定义。 具体的推导过程可以参考我的上一篇文章Y-Combinator的推导

Y = λf.(λx.f(x x))(λx.f(x x))

Ruby 版本

def y(&gen)
    lambda {|g| g[g] }.call(lambda{|f| lambda {|*args| gen[f[f]][*args] }})
end

factorial = y do |recurse|
    lambda do |x|
        x.zero? ? 1 : x * recurse[x-1]
    end
end
puts factorial.call(10)

Python 版本

def y_combinator(gen):    
    return (lambda g: g(g))(lambda f: (lambda *args: (gen(f(f)))(*args)))

ret = y_combinator(lambda fab: lambda n: 1 if n < 2 else n * fab(n - 1))(10)
print(ret)

JavaScript 版本

function y(gen) {
    return (function(g) {
        return g(g);
    })(function(f) {
        return function(args){
            return gen(f(f))(args);
        };
    });
}

var fact = y(function (fac) {
    return function (n) {
        return n <= 2 ? n : n * fac(n - 1);
    };
});
console.log(fac(5));

Clojure 版本

(defn Y [gen]
  ((fn [g] (g g))
    (fn [f]
      (fn [n] ((gen (f f)) n)))))

(defn fac-gen [f] (fn [n] (if (<= n 0) 1 (* n (f (dec n))))))
(assert (= ((Y fac-gen) 5) 120))

参考

  1. Lambda演算之自然数
  2. Y-Combinator的推导(Clojure描述)
  3. Y-Combinator的推导(JavaScript描述)
目录
相关文章
|
2月前
|
Rust 安全 前端开发
Rust还是其他语言:考量因素与案例分析
【2月更文挑战第1天】本文将探讨在选择编程语言时,为什么Rust可能会成为理想的选择。我们将分析Rust的主要优势,如内存安全、性能、并发编程和所有权系统,并将其与其他流行的编程语言进行比较。此外,我们还将通过具体的案例分析,展示Rust在实际应用中的优势和应用场景。
|
2月前
|
Rust 安全 编译器
Rust中的不安全代码:挑战与注意事项
Rust语言以其内存安全和性能优势著称,但在某些情况下,开发者可能需要使用不安全代码。本文将探讨Rust中不安全代码的使用场景,并详细分析使用不安全代码时需要注意的关键事项,以确保代码的安全性和稳定性。
|
2月前
|
Rust 安全 物联网
Rust在系统级编程中的独特优势
本文深入探讨了Rust在系统级编程中的独特优势,包括其内存安全、高性能、并发编程能力以及与其他语言的互操作性。通过实际案例,展示了Rust如何在操作系统、嵌入式系统、网络编程等领域发挥重要作用,并预测了Rust在未来系统级编程中的发展趋势。
|
2月前
|
存储 算法 C语言
【编程陷阱】编写出色C++代码:遵循的注意事项和最佳实践
【编程陷阱】编写出色C++代码:遵循的注意事项和最佳实践
34 0
|
9月前
|
存储 负载均衡 应用服务中间件
项目实战典型案例17——环境混用来带的影响
项目实战典型案例17——环境混用来带的影响
58 0
|
9月前
|
存储 应用服务中间件 测试技术
【项目实战典型案例】17.环境混用带来的影响
【项目实战典型案例】17.环境混用带来的影响
|
9月前
|
应用服务中间件 nginx
项目实战17—环境混用带来的影响
项目实战17—环境混用带来的影响
68 1
|
9月前
|
算法 Java 程序员
01-C++核心语法|C++概述【C++简介、C++起源、可移植性和标准、为什么C++会成功、从一个简单的程序开始认识C++】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
01-C++核心语法|C++概述【C++简介、C++起源、可移植性和标准、为什么C++会成功、从一个简单的程序开始认识C++】
|
11月前
|
存储 Rust 安全
Rust 一门赋予每个人构建可靠且高效软件能力的语言
Rust 一门赋予每个人构建可靠且高效软件能力的语言
149 0
|
设计模式 开发框架 前端开发
设计概念的统一语言
设计概念的统一语言