问题标签 [thunk]

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 投票
1 回答
123 浏览

scala - 为什么在 Scala 中定义 Streams 时必须显式强制执行 thunk?

我正在阅读有关 Streams 的 Scala 教科书

教科书上写着

“由于技术限制,这些是必须明确强制的 thunk,而不是名称参数。”

我想教科书的意思是h: ()=>A, t: ()=>Stream[A]不应该用 h: =>A, t: =>Stream[A]. 但是什么是所谓的“技术限制”禁止这样做呢?

0 投票
1 回答
22 浏览

javascript - 协程库中 thunkToPromise 的目的是什么?

我知道co有点过时了,但我仍然对它的工作原理感兴趣。但是,我发现很难理解该thunkToPromise功能的目的:

thunk 是一个没有参数的函数,但fn仍使用一个参数调用。此外还有这个奇怪的递归调用res(res),通常会导致堆栈溢出。这里发生了什么?我将如何申请thunkToPromise,以便它做一些有意义的事情?

0 投票
1 回答
38 浏览

javascript - 如何用 Church 编码延迟类型?

使用函数,我们可以从任何类型中抽象出来。下面以Option类型为例:

现在我想对延迟类型进行编码以在 Javascript 中获得惰性效果。但我不知道正确的方法,以及这种努力是否对 Church Encoding 有意义。这是我的第一个镜头:

我在这里完全处于黑暗之中。这种方法会导致任何有意义的事情吗?

0 投票
0 回答
160 浏览

c++ - C++/CLI 本机类中的函数是否编译为 MSIL 或本机 x64 机器代码?

这个问题与我的另一个问题有关,标题为Calling MASM PROC from C++/CLI in x64 mode 会产生意外的性能问题。我没有收到任何评论和答案,但最终我发现问题是由编译器在托管函数调用非托管函数时插入的函数thunk引起的,反之亦然。我将不再详细介绍,因为今天我不想关注这种隧道机制的另一个后果。

为了为这个问题提供一些上下文,我的问题是为了性能,用 MASM64 文件中的函数替换非托管 C++/CLI 类中的 64 到 128 位无符号整数乘法的 C++ 函数。ASM 替换非常简单:

我期望通过使用简单的 CPU MUL 指令将编译函数替换为四个 32 到 64 位乘法来大幅提升性能。最大的惊喜是 ASM 版本比 C++ 版本慢了大约四倍(!)。经过大量的研究和测试,我发现 C++/CLI 中的一些函数调用涉及到 thunking,这显然是一个非常复杂的事情,它比 thunked 函数本身要花费更多的时间。

在阅读了有关此thunking的更多信息后,事实证明,每当您使用编译器选项/clr时,所有函数的调用约定都会默默地更改为__clrcall,这意味着它们成为托管函数。异常是使用编译器内在函数、内联 ASM 以及通过 dllimport 调用其他 DLL 的函数——正如我的测试所揭示的,这似乎包括调用外部 ASM 函数的函数。

只要所有交互函数都使用 __clrcall 约定(即托管),就不会涉及到 thunking,并且一切都运行顺利。一旦在任一方向上越过托管/非托管边界,就会启动thunking,并且性能会严重下降。

现在,在这个冗长的序言之后,让我们进入我的问题的核心。据我了解__clrcall约定和/clr编译器开关,以这种方式在非托管 C++ 类中标记函数会导致编译器发出 MSIL 代码。我在 __clrcall 的文档中找到了这句话:

将函数标记为 __clrcall 时,表明函数实现必须是 MSIL,并且不会生成本机入口点函数。

坦率地说,这吓到我了!毕竟,为了获得真正的本机代码,我正在经历编写 C++/CLI 代码的麻烦,即超快的 x64 机器代码。但是,这似乎不是混合程序集的默认设置。如果我弄错了,请纠正我:如果我使用 VC2017 给出的项目默认值,我的程序集包含 MSIL,它将被 JIT 编译。真的?

有一个#pragma managed似乎抑制了 MSIL 的生成,以支持基于每个功能的本机代码。我已经对其进行了测试,并且它可以工作,但问题是一旦本机代码调用托管函数,thunking 就会再次受到阻碍,反之亦然。在我的 C++/CLI 项目中,我发现无法配置 thunking 和代码生成,而不会在某些地方受到性能影响。

所以我现在问自己:首先使用 C++/CLI 有什么意义?当所有内容仍编译为 MSIL 时,它是否会给我带来性能优势?也许最好用纯 C++ 编写所有内容并使用 Pinvoke 调用这些函数?我不知道,我有点卡在这里。

也许有人可以对这个文档记录非常差的话题有所了解......

0 投票
2 回答
105 浏览

javascript - thunk 或基于对的延迟类型的表现力有区别吗?

给出了两种都代表延迟计算的类型:

一个重要的区别似乎是deferThunk倾向于单子,而deferPair倾向于comonad。我更喜欢deferPair,因为 thunk 执行在 Javascript 中很昂贵。但是,我不确定可能的缺点。

0 投票
0 回答
349 浏览

python - 在 python 中使用 thunk、trampolines 和延续传递

我从这个博客了解了尾调用优化(TCO)的概念:给我唱一首 Stack Overflow 之歌:音乐尾调用优化

进入这个概念(或“功能”或“优化技术”),我开始知道在 python 中使用 TCO 并不是一种 Python 的方式,正如 Guido 解释的那样:

http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html http://neopythonic.blogspot.com/2009/04/final-words-on-tail-calls.html

进一步检查后发现 James Tauber 的博客讨论了 James Tauber 的Thunks、Trampolines 和 Continuation 传递 Thunks、Trampolines 和 Continuation 传递

James Tauber 展示了如何使用 Thunks、Trampolines 和 Continuation 传递来解决递归函数的堆栈调用问题,但解释有些难以掌握。

所以,这里有一些我想澄清的问题:

  1. 这里的任何人都可以对这些概念提供一个可以理解的解释吗?
  2. 这个概念是试图在 python 中实现 TCO 还是与 TCO 不同?
  3. 由于 Guido 将 TCO 称为not a pythonic way因为 TCO 没有给出适当的回溯,那么这个概念是否Thunks, Trampoline and Continuation passing满足保留回溯的要求?
0 投票
1 回答
936 浏览

javascript - Redux reducer,将多个 api 分页请求附加到 state

我正在构建一个应用程序。此应用需要为产品数据请求 woocommerce API。API 一次只允许 100 个项目,因此我不得不使用动态页面参数调用此请求 4 次。

我对这些数据的目标是让 reducer 将数据组合到一个数组中,该数组可以在反应组件中进行过滤。

我目前的问题是我的减速器正在将每个 API 调用添加到它自己的数组中。因此,我没有一个包含 300 个 ish 产品的大数组,而是有一个包含 4 个数组的数组,每个数组包含 100 个产品。请参见下图。

状态数据结果

这是动作:

使用异步运行 4 次:

我的减速机:

我不是世界上最伟大的程序员,我会喜欢你的意见。这几天我一直在用头撞墙。TIA。

0 投票
1 回答
360 浏览

reactjs - 运行 npm install 后“getFirebase() 不是函数”

我一直在开发一个小的 React 应用程序,并且进展顺利,我想,但我离我想要的理解水平还差得很远。我遇到了一个让我目瞪口呆的障碍。我的代码一切正常。我在我的环境(Visual Studio)中打开了另一个应用程序,但它不能正常工作,所以在其他程序员的建议下我执行了 npm Install。这就是我的问题开始的地方。我不知道确切的原因,但我担心我的包裹被弄乱了。当我在此之后重新打开自己的应用程序时,我开始在我的调试器中收到标题中的错误消息:“getFirebase() 不是函数”。显然丢失的东西因此停止工作。我试图还原软件包并安装正确版本的东西。根据 npm list 我安装的版本是:

我用谷歌搜索自己很傻,react-redux-firebase v3 似乎经常导致这个问题,但我没有。我不再知道在哪里继续寻找,谷歌没有帮助。你们中的一位专家能指出我正确的方向吗?

您将在下面找到我的 firebase 配置文件、使用它的 index.js、触发错误的操作的代码以及触发该操作的页面。谢谢大家的时间!

index.js:

fbConfig.js

authActions.js

签名链接.js

0 投票
2 回答
227 浏览

reactjs - 为什么调度动作后“状态”为空?

我正在处理登录身份验证。用户成功登录后,我想根据状态中的令牌值显示注销按钮。用户成功登录但实际上状态为空并且没有从快速服务器传递的值。因此,如果状态令牌属性为空,则登录后不会显示注销按钮。

接口代码

动作代码

类型代码

用户减速器

根减速器

主页

index.js

0 投票
1 回答
264 浏览

javascript - 蹦床的奇怪行为

最近在codewars上做一些JS任务,遇到了这个任务Tail recursion with trampoline。这里我们需要创建 thunk 函数和 trampoline 函数来摆脱恼人的 RangeError: Maximum call stack size exceeded。所以我尝试了这段代码:

这没有用,仍然有 RangeError。但是在我将 console.log() 添加到 _isOdd 或 _isEven 之后,它不会抛出错误并通过所有测试。像这样:

我理解错误并重写了代码,但不明白为什么添加console.log()时它会起作用。