问题标签 [letrec]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
recursion - 哪些语言支持*递归*函数文字/匿名函数?
如今,似乎有不少主流语言支持函数文字。它们也被称为匿名函数,但我不在乎它们是否有名字。重要的是,函数文字是一个表达式,它产生一个尚未在其他地方定义的函数,例如在 C 中,&printf
不计算在内。
编辑添加:如果你有一个真正的函数文字表达式<exp>
,你应该能够将它传递给一个函数f(<exp>)
或立即将它应用于一个参数,即。<exp>(5)
.
我很好奇哪些语言可以让你编写递归的函数文字。维基百科的“匿名递归”文章没有给出任何编程示例。
让我们以递归阶乘函数为例。
以下是我知道的:
JavaScript / ECMAScript 可以做到这一点
/li>callee
:在语言中很容易使用
letrec
,例如 Haskell(它叫它let
):let fac x = if x<2 then 1 else fac (x-1) * x in fac
在 Lisp 和 Scheme 中有等价物。请注意, 的绑定
fac
是表达式的局部变量,因此整个表达式实际上是一个匿名函数。
还有其他人吗?
functional-programming - letrec有什么好处?
在阅读“经验丰富的计划者”时,我开始了解letrec
. 我理解它的作用(可以用 Y-Combinator 复制),但本书使用它来代替在已经define
d 函数上重复运行,该函数对保持静态的参数进行操作。
一个使用define
d 函数的旧函数的例子(没有什么特别的):
现在举一个相同功能的例子,但使用letrec
:
除了略长且更难阅读之外,我不知道他们为什么要重写书中的函数以使用 letrec。以这种方式重复静态变量时是否会提高速度,因为您不会一直传递它?
对于具有保持静态但减少了一个参数(例如递归列表的元素)的函数,这是标准做法吗?
来自更有经验的计划者/LISPers 的一些输入会有所帮助!
haskell - 我如何使用修复,它是如何工作的?
我对文档有点困惑fix
(尽管我想我现在明白它应该做什么),所以我查看了源代码。这让我更加困惑:
这究竟是如何返回一个固定点的?
我决定在命令行尝试一下:
它挂在那里。现在公平地说,这是在我的旧 macbook 上,有点慢。然而,这个函数在计算上不能太昂贵,因为任何传入 id 的东西都会返回相同的东西(更不用说它不会占用 CPU 时间)。我究竟做错了什么?
recursion - 方案:为什么评估 letrec 中定义的递归函数会失败?
我正在用 Scheme (DrRacket Pretty Big) 写一个愚蠢的 letrec:
语法检查没问题,但运行失败:
调试器在故障点说:
你能告诉我我错过了什么吗?更正也很好,但请不要定义,虽然没有必要。
谢谢!
scheme - 如何模式匹配'letrec'
我正在尝试使用 match-lambda 对 letrec 的调用进行模式匹配。在我看来,这种模式:
应该匹配以下形式的调用:
但是,当然,这是行不通的。
任何建议表示赞赏。
haskell - 转换计算固定点的函数
我有一个根据迭代计算固定点的函数:
请注意,我们可以从中抽象为:
这个函数可以用fix来写吗?似乎应该从这个方案转变为有修复的东西,但我没有看到。
variables - 不使用“set!”如何实现“letrec”?
不使用如何letrec
实现set!
?
在我看来,这set!
是一种命令式编程结构,使用它会失去函数式编程的好处。
scala - Scala中的letrec?(“打结?”的不变方式)
假设我有一个像这样的愚蠢的小案例类:
我怎样才能定义a
和b
不可变的那样a.other
isb
和b.other
is a
?scala 是否提供了一些“打结”的方法?我想做这样的事情:
可能性
在 Haskell 中,我会这样做:
a
与和的绑定b
包含在同一个let
表达式中,或者在顶层。
或者,在不滥用 Haskell 的自动 letrec 功能的情况下:
注意惰性模式,~(a', b')
这很重要。
variables - 'let' 或 'letrec' 和 'define' 用于创建本地绑定有什么区别?
我不明白两者之间的区别是什么(对于人为的例子感到抱歉):
和
据我所知,它们都创建了一个新的作用域,并在该作用域中创建了 4 个局部变量,它们相互引用并引用自身,并评估并返回一个主体。
我在这里遗漏了什么,还是与 scoped sletrec
同义?define
我知道这可能取决于实现;我试图了解 Lisps 的基础知识。
haskell - 为什么这段代码使用阴影`let`绑定挂起?
运行此代码:
在口译员中:
挂起时 CPU 使用率很低。为什么是这样?我预计j = 16
。