问题标签 [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.
clojure - Clojure 中是否有执行相当于“first”的归约函数?
我经常写形式的代码
将其转换为使用传感器的代码时,我最终会得到类似
写作(completing #(reduced %2))
而不是first
我根本不喜欢。它不必要地掩盖了一项非常简单的任务。是否有更惯用的方式来执行此任务?
clojure - 我用什么来减少这个换能器?
这是一个简单的换能器,可以将数字倍增。我想知道reduced
允许提前终止的价值是什么?
我已经尝试过(transient [])
,但这意味着换能器仅适用于矢量。
javascript - 使用 Ramda 将减速器转换为换能器
以下函数reduceIfEven
使用谓词检查 reducer 函数为每一步接收的值。如果谓词返回 true,则将该值添加到结果 ( acc
) 中,否则从 reducer 原样返回结果。请注意,没有短路 - 所有值都被处理,要么被忽略,要么被添加到结果中。
如何使用transduce创建可比较的函数?
我最初的尝试碰壁了,因为我需要第一个函数来接收结果和map
不接收的值。
注意:这是一个学术练习。我只是对如何完成感兴趣,而不是是否应该以这种方式完成。
clojure - 为什么我的传感器功能比使用 ->> 运算符慢?
在解决 Hackkerank ( https://www.hackerrank.com/challenges/string-compression/problem ) 的问题时,我编写了 2 个带有和不带有传感器的实现。
我期望传感器实现比函数链接运算符更快->>
。不幸的是,根据我的迷你基准,链接运算符的性能比传感器高 2.5 倍。
我在想,我应该尽可能使用传感器。还是我没有正确理解传感器的概念?
时间:
“经过时间:0.844459 毫秒”
“经过时间:2.697836 毫秒”
代码:
clojure - 未调用传感器的 init
我正在编写一个自定义转换器作为练习,但我惊讶地发现它的 0-arity init 函数没有被调用。
为什么?
它与我使用的聚合函数有关吗?如果是,哪些会调用 init 函数,为什么其他人不会?
clojure - 我可以在不连接它们的情况下转换/导出多个集合吗
下面是我正在做的一个简单的版本:
有没有办法获得相同的教育,而无需支付成本concat
,从而创建一个中间惰性序列?
以下可能已经少了一点浪费,因为我们只有一个向量,而不是惰性序列,但我想知道是否可以避免这种情况。
clojure - 对有状态转换器进行故障排除
我正在尝试创建一个有状态的转换器,join-averages
(这里的要点)。
运行 let 块显示我正确地加入了值。但是结果输出仍然没有连接值。
关于为什么join-averages
有状态的传感器没有返回正确结果的任何想法?
代码
javascript - [a,b].reduce(f,x) 代码到 [a,b].reduce(f) 使用基于传感器 /CPS 的功能引用?
在我之前的问题中:
@Aadit M Shah 给了我惊人的解决方案,如下所示:
https://stackoverflow.com/a/51420884/6440264
给定一个像A(a)(b)(f)
where f
is a function 这样的表达式,不可能知道是否f
应该将其添加到列表中,或者它是否是归约函数。因此,我将描述如何编写表达式,例如A(a)(b)(f, x)
which 等价于[a, b].reduce(f, x)
. 这使我们能够根据您提供的参数数量来区分列表何时结束:
它由于延续而起作用。每次我们添加一个新元素,我们都会累积一个 CPS 函数。每个 CPS 函数调用前一个 CPS 函数,从而创建一个 CPS 函数链。当我们给这个 CPS 函数链一个基函数时,它会展开链并允许我们减少它。换能器和镜头背后的想法相同。
我还有2个问题。
为了区分 reduce 函数,我考虑了一些使用反射的自定义 Typing 机制,但是为了专注于这个问题,到目前为止我想简单地应用
const isReducer = f => (typeof f === 'function');
提供初始值的要求对折叠/归约有限制,例如,不可能为归约提供二进制操作的初始值,例如
常量头 = (a, b) => a; 常量尾 = (a, b) => b;
(除非您手动提供第一个/最后一个值,这对运行代码没有意义)理论上,每个二进制操作都有一个标识值,但是不可能按原样提供。唯一的方法是抽象为一个身份。
话虽如此,我无法将提供的代码重构为单个参数和函数的 reducer 类型,并将默认值作为序列的初始值。
你能提供重构的代码吗?此外,此示例的传感器/CPS 的任何信息都值得赞赏。
javascript - 换能器平坦且独特
我想知道是否有一种方法可以使用转换器来展平列表并过滤唯一值?
通过链接,很容易:
但是这里我们在列表上循环两次(+ n 按深度层)。不理想。
我想要实现的是在这种情况下使用换能器。我已经阅读了有关它的 Ramda 文档https://ramdajs.com/docs/#transduce,但我仍然找不到正确编写它的方法。
目前,我使用一个带有递归函数的reduce函数:
我们在元素上有一个循环(+ n 循环,深度层很深),这看起来更好,更优化。
在这种情况下,这甚至可以使用转换器和迭代器吗?有关 Ramda 换能器功能的更多信息:https ://gist.github.com/craigdallimore/8b5b9d9e445bfa1e383c569e458c3e26