Y 组合子

C#版

 

static Func<T, TResult> Fix<T, TResult>(Func<Func<T, TResult>, Func<T, TResult>> f)

{

    return x => f(Fix(f))(x);

}

  

static Func<T1, T2, TResult> Fix<T1, T2, TResult>(Func<Func<T1, T2, TResult>, Func<T1, T2, TResult>> f)

{

    return (x, y) => f(Fix(f))(x, y);

}

 

JavaScript版

1
2
3
4
5
6
7
8
var Y = function (F) {
  return ( function (x) {
   return F( function (y) { return (x(x))(y);});
   })
     ( function (x) {
   return F( function (y) { return (x(x))(y);});
   }) ;
} ;

应用

01
02
03
04
05
06
07
08
09
10
11
12
// var g = λf.λn.(n <= 1 ? 1 : n * f(n - 1))
var g = function (f) {
     return function (n) {
         if (n <= 1) {
             return 1
         } else {
             return n*f(n-1);
         }
     }
}
  
alert(Y(g)(5))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我理解您的问题是要求给出几种可以用λ演算表示的Y组合的语法。 在λ演算中,Y组合是一个无限递归的函数,可以用来实现递归定义。Y组合的常规形式如下: Y = λf.(λx.f (x x)) (λx.f (x x)) 这个式可以看作是将函数f作为参数传递给一个“不动点算”,而“不动点算”的实现就是无限递归的。 根据这个形式,我们可以给出一些可以用λ演算表示的Y组合的语法,如下所示: 1. 直接使用常规形式的Y组合: Y = λf.(λx.f (x x)) (λx.f (x x)) 2. 通过将常规形式的Y组合中的“不动点算”替换为其他的函数实现: Y' = (λx.(λy.y (x x y))) (λx.(λy.y (x x y))) 这个式是将“不动点算”替换为了一个新的函数(λx.(λy.y (x x y))),这个新函数的定义与“不动点算”相似。 3. 使用一个更加通用的不动点算——Z组合: Z = λf.(λx.f (λy.x x y)) (λx.f (λy.x x y)) 这个式是一个更加通用的不动点算,可以用来替代Y组合。其中,Z组合通过使用两个不同的参数来构建一个不动点算。 ### 回答2: λ演算是一种形式化的计算机科学工具,用于研究函数定义、函数应用和递归等概念。Y组合是λ演算中用于实现递归的一种方法。 在λ演算的语法中,Y组合可以通过以下几种方式进行定义: 1. 基本定义: Y = λf. (λx. f (x x)) (λx. f (x x)) 在上述定义中,Y是一个函数,它接受一个函数f作为参数。Y将一个函数应用到它自己的一个拷贝上,这个拷贝会继续递归调用Y自身。 2. 在λ演算中使用递归方式定义Y组合: Y = (λf. (λx. f (λy. ((x x) y))) (λx. f (λy. ((x x) y)))) 在这种定义中,Y组合是一个递归函数,它接受一个函数f作为参数。这个定义通过使用λ演算中的延迟评估技术(lazy evaluation)来实现递归。 3. 使用命名函数的方式定义Y组合: Y = (λf. ((λx. f (λy. ((x x) y))) (λx. f (λy. ((x x) y))))) (λf. (λx. f (λy. ((x x) y))) (λx. f (λy. ((x x) y)))) 这种定义方式中,Y组合包含在两个(λx. f (λy. ((x x) y)))函数的应用中,第一个函数应用是用于计算递归调用,第二个函数应用是用于计算非递归调用。 综上所述,以上是几种λ演算的语法写的Y组合的定义方式。不同的定义方式在实现递归上略有差异,但都能实现λ演算中的递归功能。 ### 回答3: 在λ演算中,Y组合用于实现递归函数。Y组合的定义如下: Y = (λf.(λx.f (x x)) (λx.f (x x))) Y组合的语法可以通过以下几种方式表示: 1. 使用λ演算的原始语法: Y = λf.(λx.f (x x)) (λx.f (x x)) 2. 使用字符串表示: Y = "(λf.(λx.f (x x)) (λx.f (x x)))" 3. 使用图形表示: ______ | | | λf. | ______ | | | | | | λx.| | _____ | || | | | | f | | | λx.f | | (x | | | (x x)| | )| | | | | )| | |_____ | |______| | | | f | |(x x)| |_____| 这些表示方法都描述了Y组合的形式。无论使用哪种表示方式,Y组合在λ演算中都是非常重要的,用于实现递归函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值