问题标签 [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.

0 投票
16 回答
3368 浏览

recursion - 哪些语言支持*递归*函数文字/匿名函数?

如今,似乎有不少主流语言支持函数文字。它们也被称为匿名函数,但我不在乎它们是否有名字。重要的是,函数文字是一个表达式,它产生一个尚未在其他地方定义的函数,例如在 C 中,&printf不计算在内。

编辑添加:如果你有一个真正的函数文字表达式<exp>,你应该能够将它传递给一个函数f(<exp>)或立即将它应用于一个参数,即。<exp>(5).

我很好奇哪些语言可以让你编写递归的函数文字。维基百科的“匿名递归”文章没有给出任何编程示例。

让我们以递归阶乘函数为例。

以下是我知道的:

  • JavaScript / ECMAScript 可以做到这一点callee

    /li>
  • 在语言中很容易使用letrec,例如 Haskell(它叫它let):

    let fac x = if x<2 then 1 else fac (x-1) * x in fac

    在 Lisp 和 Scheme 中有等价物。请注意, 的绑定fac是表达式的局部变量,因此整个表达式实际上是一个匿名函数。

还有其他人吗?

0 投票
3 回答
7593 浏览

functional-programming - letrec有什么好处?

在阅读“经验丰富的计划者”时,我开始了解letrec. 我理解它的作用(可以用 Y-Combinator 复制),但本书使用它来代替在已经defined 函数上重复运行,该函数对保持静态的参数进行操作。

一个使用defined 函数的旧函数的例子(没有什么特别的):

现在举一个相同功能的例子,但使用letrec

除了略长且更难阅读之外,我不知道他们为什么要重写书中的函数以使用 letrec。以这种方式重复静态变量时是否会提高速度,因为您不会一直传递它?

对于具有保持静态但减少了一个参数(例如递归列表的元素)的函数,这是标准做法吗?

来自更有经验的计划者/LISPers 的一些输入会有所帮助!

0 投票
4 回答
18770 浏览

haskell - 我如何使用修复,它是如何工作的?

我对文档有点困惑fix(尽管我想我现在明白它应该做什么),所以我查看了源代码。这让我更加困惑:

这究竟是如何返回一个固定点的?

我决定在命令行尝试一下:

它挂在那里。现在公平地说,这是在我的旧 macbook 上,有点慢。然而,这个函数在计算上不能昂贵,因为任何传入 id 的东西都会返回相同的东西(更不用说它不会占用 CPU 时间)。我究竟做错了什么?

0 投票
1 回答
376 浏览

recursion - 方案:为什么评估 letrec 中定义的递归函数会失败?

我正在用 Scheme (DrRacket Pretty Big) 写一个愚蠢的 letrec:

语法检查没问题,但运行失败:

调试器在故障点说:

你能告诉我我错过了什么吗?更正也很好,但请不要定义,虽然没有必要。

谢谢!

0 投票
2 回答
216 浏览

scheme - 如何模式匹配'letrec'

我正在尝试使用 match-lambda 对 letrec 的调用进行模式匹配。在我看来,这种模式:

应该匹配以下形式的调用:

但是,当然,这是行不通的。

任何建议表示赞赏。

0 投票
2 回答
1099 浏览

haskell - 转换计算固定点的函数

我有一个根据迭代计算固定点的函数:

请注意,我们可以从中抽象为:

这个函数可以用fix来写吗?似乎应该从这个方案转变为有修复的东西,但我没有看到。

0 投票
2 回答
1804 浏览

variables - 不使用“set!”如何实现“letrec”?

不使用如何letrec实现set!

在我看来,这set!是一种命令式编程结构,使用它会失去函数式编程的好处。

0 投票
1 回答
794 浏览

scala - Scala中的letrec?(“打结?”的不变方式)

假设我有一个像这样的愚蠢的小案例类:

我怎样才能定义ab不可变的那样a.otherisbb.otheris a?scala 是否提供了一些“打结”的方法?我想做这样的事情:


可能性

在 Haskell 中,我会这样做:

a与和的绑定b包含在同一个let表达式中,或者在顶层。

或者,在不滥用 Haskell 的自动 letrec 功能的情况下:

注意惰性模式,~(a', b')这很重要。

0 投票
2 回答
1976 浏览

variables - 'let' 或 'letrec' 和 'define' 用于创建本地绑定有什么区别?

我不明白两者之间的区别是什么(对于人为的例子感到抱歉):

据我所知,它们都创建了一个新的作用域,并在该作用域中创建了 4 个局部变量,它们相互引用并引用自身,并评估并返回一个主体。

我在这里遗漏了什么,还是与 scoped sletrec同义?define

我知道这可能取决于实现;我试图了解 Lisps 的基础知识。

0 投票
1 回答
230 浏览

haskell - 为什么这段代码使用阴影`let`绑定挂起?

运行此代码:

在口译员中:

挂起时 CPU 使用率很低。为什么是这样?我预计j = 16