1
6
首先,让我们看一下基本问题。和是匿名函数的左参数和右参数:
Reduce和scan可以与用户定义的函数一起使用,它们通常都是这样。它们是这样工作的:
使用这些定义,让我们评估一下让您困惑的示例:
这里需要注意的重要一点是,根据通常的APL评估规则,每次减少都会完成
从右到左。
将此与Haskell的比较
因此,使用
Haskell的
APL的扫描功能实际上介于
现在,我们应该清楚评估您尝试的解决方案时会发生什么:
关于你实际想做的事情,当然有很多解决方案。这是我想到的第一个(
由于答案已经很长了,我将把分析作为练习。正如我所说,这只是我第一个想到的,并使用了与你不同的方法。我相信一些更有经验的APLer会想出一个更好、更优雅的解决方案。 编辑:这是一个尽可能接近您最初方法的解决方案。由于某种原因,我无法让它与GNUAPL一起工作,这是我通常使用的实现,所以我花了一些时间。这可能是一个bug,但我不知道。不幸的是,GNUAPL开发人员不太喜欢像动态函数这样的语言扩展,所以这可能是故意的。我有时间时会调查的。我在NGN和Dyalog工作。也许可以进一步改进,但这正是你想要做的:
(编辑:正如Elias在下面的评论中指出的那样,你可以通过在一个匿名函数中包装缩减来在GNUAPL中实现这一点:
第二个编辑:这可能是我能想出的最优雅的解决方案:
(此外,请注意,上述评估中可能存在一些错误。计算机比人类更擅长这种乏味的工作。无论如何,要点应该很清楚。) 事实上,这是一个过于简单的说法。这个解释使用了所谓的 插入缩减样式。 实现还可以使用 封闭缩减样式, 这导致细微的差异。此外,这是扫描的原始O(n)定义。实现通常会对关联函数使用更有效的实现。 |
2
0
对于一个老派APLer来说,这个问题看起来很像 分区正归约 在嵌套阵列出现和出现之前,分区技术一直被大量使用,直到20世纪80年代末。有关详细信息,请参阅 www.sudleyplace.com/APL/boolean.pdf(第10页为pPLRED,第15页为其助手函数N-delta) 和 http://www.chilton.com/~jimw/apl85.html (搜索pPLUSRED) |
nanounanue · 使用python和高级操作符的函数管道 6 年前 |
Zazaeil · 这个特定的递归可以用尾部优化的方式重写吗? 6 年前 |
corvid · 使用ramda通过变量进行升序/降序 6 年前 |
CodingNow · Scala:如何制作多种方法并逐一应用? 6 年前 |