package com.light.sword.ycombinator
* FP: Y Combinator
* lambda f. (lambda x. (f(x x)) lambda x. (f(x x)))
* Created by jack on 2017/7/9.
typealias G<T, R> = (T) -> R
interface F<T, R> : Function1<F<T, R>, G<T, R>>
fun <T, R> f(block: (F<T, R>) -> G<T, R>) = object : F<T, R> {
override fun invoke(g: F<T, R>) = block(g)
typealias E<T, R> = Function1<G<T, R>, G<T, R>>
* Y 组合子函数
* @param e :E 入参,是一个函数类型 Function1<G<T, R>, G<T, R>>
fun <T, R> Y(e: E<T, R>) = ({ g: F<T, R> -> g(g) })(f { g ->
e { x -> g(g)(x) }
* 用 Y 组合子实现 factorial 阶乘函数
val factorial: (Int) -> Int = Y { f ->
{ x ->
if (x == 0) 1 else x * f(x - 1)
* 用 Y 组合子实现 fibonacci 数列函数 fib: (T)->R
* Y(fib) = fib
* 可以推断: Y(Y(fib)) = Y(fib) = fib
val fib: (Int) -> Int = Y { f ->
{ x ->
if (x == 1 || x == 2) 1 else f(x - 1) + f(x - 2)
fun main() {
println(fib(10))
println(factorial(10))
The Y Combinator (no, not that one) A crash-course on lambda calculus:
https://medium.com/@ayanonagon/the-y-combinator-no-not-that-one-7268d8d9c46
The Y Combinator (Slight Return):
https://mvanier.livejournal.com/2897.html
Y combinator:
https://rosettacode.org/wiki/Y_combinator#Kotlin
在前面的几个帖子里,我已经建立了如何把lambda演算变成一个有用的系统的点点滴滴。 我们已经有了数字,布尔值和选择运算符。我们唯一欠缺的是重复。
这个有点棘手。lambda演算使用递归实现循环(递归的解释可以看这里)。 但是,由于在lambda演算里函数没有名字,我们得采取一些非常手段。这就是所谓的Y组合子,又名lambda不动点运算符。
让我们先来看看lambda演算之外的一个简单的递归函数。阶乘函数,这是标准的例子:
factorial(n) = 1 if n = 0
在这个例子中,我们展示了使用QueryFusionRetriever的两种方法,这两种方法旨在改进互惠秩融合(Reciprocal Rank Fusion)。互惠秩融合是一种用于合并多个排序列表的技术,特别是在信息检索领域,它通过考虑每个列表中项目的排名位置来综合不同来源的结果。QueryFusionRetriever则可能是指一种更先进的工具或算法,它实现了对查询结果进行融合的新方法,以期获得比传统互惠秩融合更好的效果。
请提供更多的上下文或者具体说明您想了解的内容,以便我能为您提供更准确的翻译和解释。
Y组合子的用处
作者:王霄池链接:https://www.zhihu.com/question/21099081/answer/18830200来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Y组合子的用处是使得 lambda 表达式不需要名字。
如你所说,阶乘函数可以这样定义:
let F = lambda n. n==0 ? 1 : n*(F...
( * n (factorial ( - n 1 ))))))
请注意,在定义阶乘函数时,我们进行了递归调用。 我们将这种定义称为显式递归定义。 您很快就会看到我们所说的隐式递归定义(扰流器:通过非递归方法生成的递归函数)。
目标-消除明确的递归
如果我们被限制进行递归调用,我们仍然可以实现阶乘函数吗? 答案是肯定的,这将使我们直接进入Y-Combinator。
什么是Y组合器?它
推导Y组合子
这篇文章的创作动机是:之前一直不理解Y组合子是怎么被想出来的,查这方面的资料看到了重新发明 Y 组合子 JavaScript(ES6) 版,但是写得不太清楚,于是决定在本文彻底讲清楚。
本文的主要内容是在递归函数的非递归定义中引入omega组合子和Y组合子,并推导他们的形式。本文分为三个部分:
在FP中通常用递归的方式定义阶乘函数,本文首先对其给出了一个非递归的定义。
对上述过程,...
Y 组合子
lambda函数是匿名函数,也就是没有名字的函数,那么如何用lambda函数实现递归呢?
因为python的匿名函数表示方法局限性很大,所以我使用了scheme语言讲解。
下面看一个递归求阶乘的函数:
(define fac
(lambda (x)
(if (= 0 x)
(* x (fac (- x 1))))))
如果不要第一行的命...
Y combinator本身是一个无状态函数,当用于另一个无状态的函数时,将返回该函数的递归版本。比如定义Y:(为了说明方便,用λi代替lambda关键字)
(defun y (f)
((λ1 (x) (funcall x x))
(λ2 (y)
(funcall f (λ3 (&rest
args)
(apply (
上次发表了VS2008亮点:用Lambda表达式进行函数式编程这篇文章后,有些人提出希望看C#版。其实我本来想等大家多尝试下能否自己实现的,可惜没有太多人实际思考这个问题,是不是觉得函数式编程离我们的日常生活太远……不管怎么说,这次我将公布强类型语言C#实现不动点组合子Y的方法,以及类型推导的全过程。不喜欢强类型思考的朋友看本文一定要做好头晕的准备……
首先复习一下不动点组合子,它就是这样的东西...
Y结合子(Y Combinator,也译作Y组合子),是在原生不支持递归的编程语言中利用lambda演算实现递归的一种方式,Y结合子在支撑递归的语言中没有什么实际的用途,更多是为了锻炼大家的程序逻辑思维,通过推演充分理解lambda和闭包。下面我们利用Javascript来一步步推导Y结合子。
先一个经典的递归算法——斐波那契数列讨论,以下是Javascript原生支撑的递归