问题标签 [transducer]

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 回答
979 浏览

javascript - 我对换能器的理解正确吗?

让我们从定义开始:Atransducer是一个接受一个reducer函数并返回一个函数的reducer函数。

Areducer是一个二进制函数,它接受一个累加器和一个值并返回一个累加器。reducer 可以用一个reduce函数执行(注意:所有函数都是 curried 但我已经列出了这个以及为了可读性的定义pipe-compose你可以在现场演示中看到它们):

有了reduce我们可以实现mapfilter功能:

正如我们所看到的,这两个函数之间有一些相似之处mapfilter并且这两个函数都只适用于数组。另一个缺点是,当我们组合这两个函数时,每一步都会创建一个临时数组,该数组会传递给另一个函数。

换能器帮助我们解决了这个问题:当我们使用换能器时,不会创建临时数组,我们可以泛化我们的函数,使其不仅适用于数组。转换器需要一个transduce函数才能工作转换器通常通过传递给transduce函数来执行:

我们甚至可以定义数组mapfilter使用transducer,因为它是如此可组合:

如果您想运行代码,可以使用实时版本 -> https://runkit.com/marzelin/transducers

我的推理有道理吗?

0 投票
1 回答
374 浏览

rxjs - RxJS v5+ 中的 Observable.transduce 发生了什么?

RxJS v4 曾经有一个Observable.transduce采用传感器的方法。这允许使用在过去具有重大性能优势的独立于库的传感器操作符。

来源

RxJS v5.5 和 v6 具有可管道操作符,并且 v6 删除了方法链。因此,我假设 RxJS 操作符是标准转换器。查看源代码,似乎并非如此。

RxJS v6 运算符的功能就像一个转换器,其中每个值在下一个值通过之前完全通过链传递,但是 RxJS v6 运算符没有使用我在其他库中看到的标准转换器方法,意思是,我不认为他们'是便携式的。

关于传感器的全部事情是他们对集合本身一无所知。您可以编写 100 个普遍适用于任何集合或流类型的运算符,而不是专门为可观察对象编写 100 个运算符。

在 RxJS v5 中是否.pipe一致.transduce或完全删除了此方法?

0 投票
1 回答
38 浏览

javascript - 为什么我的转换器在从减少/组合中抽象出来时不再工作?

我被我的短路和堆栈安全传感器实现所困扰:

我正在查看代码,它非常清楚地告诉我,产生r1和的计算r2基本上是相同的。为什么我在应用transduce辅助功能时没有得到相同的结果?

0 投票
1 回答
682 浏览

typescript - Ramda Transducers 上的 Typescript 类型错误以及如何处理好代码上令人困惑的类型错误

查看transduce的 Ramda 文档,给出了两个示例,每个示例都会导致 Typescript 编译器抛出不同的错误。

示例 1:

Typescript 引发以下异常flip(append)

如果我更改flip(append)代码flip(append) as any按预期工作。

示例 2:

Typescript 引发以下异常firstOddTransducer

与上面相同,如果我更改firstOddTransducer代码firstOddTransducer as any按预期工作。

首先,这些特定的错误甚至意味着什么?

其次,用函数式打字稿处理这类问题的最佳方法是什么?因此,在查看各种 typescript 学习资源时,经常会警告用户不要使用any或反对使用// @ts-ignore,好像它是你不应该做的事情,但是我的代码库越复杂,我的编程风格变得越实用,这些内容就越多缝合我收到的完全可接受的代码的难以理解的错误消息。我不介意花一点时间来改进类型,但是当我知道代码很好时,我不想花太多时间调试类型的问题。

第三,当您不确定类型或打字稿是否存在问题时,是否有任何提示可以提供帮助,如上所述,或者 JavaScript 代码是否存在问题,例如,确定位置的技术实际的问题是你可以调查还是忽略?

0 投票
0 回答
36 浏览

signal-processing - 如何找到引导超声波束所需的参数?

老实说,我不知道这个问题是否更适合堆栈溢出、软件工程或物理学,所以如果我猜错了,请提前道歉。

我正在尝试用市售零件制造 3D 超声机(只是想看看我是否可以)。为此,我需要能够从固定的换能器阵列扫描超声波束。

我已经尝试过谷歌搜索光束转向技术,我发现的所有东西都在理论上很重要,但在实践方面明显不足。

那么,是否有一种算法可以告诉我相位角、强度等。我需要使用每个换能器将光束指向某个方向?如果这是不可能的(我强烈怀疑那个是 NP-Complete),是否有一种算法可以预测我可以用作适应度函数的光束角度?

0 投票
2 回答
94 浏览

functional-programming - 为什么我在使用 transduce 时会出错?

我对函数式编程仍然很陌生,并且一直在尝试学习如何使用传感器。我以为我有一个很好的用例,但每次我尝试用 Ramda 编写一个转换器时,我都会收到以下错误:

reduce:列表必须是数组或可迭代的

我尝试过几种方式重写它,并查看了转导网络上的几种解释,但无济于事。有什么建议么?

0 投票
4 回答
248 浏览

clojure - 如何调整来自 next.jdbc 的 IReduceInit 以使用 cheshire 将 JSON 流式传输到使用 ring 的 HTTP 响应

tl;博士如何将 IReduceInit 转换为转换值的惰性序列

我有一个数据库查询,它产生了一个相当大的数据集,用于在客户端上进行实时旋转(百万或两行,25 个属性 - 对于现代笔记本电脑来说没问题)。

我的(简化的)堆栈是调用 clojure.jdbc 来获取(我认为是惰性的)结果行序列。我可以通过 ring-json 中间件将其作为主体传递出去,从而将其序列化。ring-json 在堆上构建响应字符串存在问题,但是从 0.5.0 开始可以选择将响应流式传输出去。

我通过分析几个失败案例发现,实际上 clojure.jdbc 在将其返回之前将整个结果集实现在内存中。没问题!reducible-query我决定转向新的 next.jdbc,而不是在那个库中工作。

next.jdbc 中的关键操作是plan返回一个 IReduceInit,我可以使用它来运行查询并获取结果集...

然而,这实现了整个结果集,并且在上述情况下会给我所有的 id 预先和内存。对一个人来说不是问题,但我通常有很多。

如果我给出一个起始值,我可以减少 IReduceInit 计划,所以我可以在减少函数中进行输出......(谢谢@amalloy)

...但理想情况下,我想在对它们应用转换函数后将此 IReduceInit 转换为值的惰性序列,因此我可以将它们与 ring-json 和 cheshire 一起使用。我没有看到任何明显的方法。

0 投票
2 回答
1560 浏览

javascript - JavaScript `降低`性能

最近,我花了一些时间研究传感器(函数式编程中的工具,旨在提高性能而不损失代码的可读性/灵活性),当我开始测试它们的实际速度时,我得到了一些非常令人失望的结果。考虑:

我希望表演的顺序是

本机循环 > 传感器 > 链式映射/过滤器

同时,除了比其他任何方法都快的原生方法之外,令我惊讶的是,reduce/transduce 方法比使用 map/filter 和创建中间数组要慢得多(慢,就像 Chrome 中的一个数量级) . 有人可以向我解释这个结果的起源吗?

0 投票
1 回答
22 浏览

closures - 组成换能器;组成顺序和执行顺序

这里有一段说:

转换器的组合从右到左运行,但构建一个从左到右运行的转换堆栈(在此示例中,过滤发生在映射之前)。

我不明白。这是什么意思:变压器的组成从右到左(在本例中从底部开始)

对我来说,我所看到的只是这个组合将如何执行,它将过滤、映射和获取。从底部开始的构图顺序有什么意义。这似乎是文章中的一个重要点,所以我尽量不要错过这一点。

0 投票
1 回答
111 浏览

clojure - 聚合具有中间值的传感器

我仍在尝试更好地了解如何在 clojure 中使用传感器。在这里,我有兴趣应用聚合传感器,例如https://github.com/cgrand/xforms中的传感器,但在每一步都报告计算的中间值。

例如,下面的表达式

yield (#{1 2 3}),这只是减少的最终值。xf-incremental现在,我会对给出类似的换能器感兴趣

产量(#{1} #{1 2} #{1 2 3})

我对此感兴趣的原因是我想报告一个指标的中间值,该指标聚合了已处理值的历史记录。

知道如何以通用方式进行此类操作吗?

编辑:将 (x/into #{}) 视为聚合结果的任意转换器。更好的例子可能是我期望的 x/avg 或 (x/reduce +)

返回(1 3/2 2)(1 3 6)分别。

编辑2:另一种表述方式是,我想要一个执行缩减功能并在每一步返回累加器的转换器,它还可以重用所有可用的转换器,因此我不需要重写基本功能。