Lisp 使用Define的方案中的Y组合子
为了了解定点组合器是什么以及它的用途,我写了自己的。但我没有使用严格的匿名函数编写它,比如,我只是使用define:Lisp 使用Define的方案中的Y组合子,lisp,scheme,lambda-calculus,combinators,y-combinator,Lisp,Scheme,Lambda Calculus,Combinators,Y Combinator,为了了解定点组合器是什么以及它的用途,我写了自己的。但我没有使用严格的匿名函数编写它,比如,我只是使用define: (define combine (lambda (functional) (functional (lambda args (apply (combine functional) args)))) 我已经用阶乘和斐波那契函数对此进行了测试,它似乎有效。这是否符合定点组合器的形式定义?< P>编辑:当CHESSWEB或其他任何人证实了他的答案时
(define combine (lambda (functional)
(functional (lambda args (apply (combine functional) args))))
我已经用阶乘和斐波那契函数对此进行了测试,它似乎有效。这是否符合定点组合器的形式定义?< P>编辑:当CHESSWEB或其他任何人证实了他的答案时,暂时认为他的答案是正确的,而这是错误的。
答案似乎是肯定的。显然,在页面中间出现了完全相同的组合符:
(define Y
(lambda (f)
(f (lambda (x) ((Y f) x)))))
答案是否定的,因为根据,它甚至不符合combinator的定义,因为“combine”是一个自由变量 你不应该。我们鼓励你回答自己的问题。IIRC你可以在给出答案后的2天内接受你自己的答案。教授Y组合器的要点是看你如何用函数实现递归。通过编写递归定义,您无法做到这一点——因此您最终得到了一些有效的东西,但它只在理解Y应该做什么时有用。Mike的文章将是深入阅读的好地方,可以了解
define
-less版本是如何派生的。练习2:Y combinator不使用define
或letrec
:)感谢您指出这一点。为了确保博客的定义是正确的,你是否认为它等同于维基百科的定义:“组合器是一个高阶函数,只使用函数应用程序和较早定义的组合器来定义其参数的结果。”看见