gpt4 book ai didi

j - 在 J 中实现 Haskell 的 foldl1 的最有效方法是什么?

转载 作者:行者123 更新时间:2023-12-04 20:22:14 28 4
gpt4 key购买 nike

在 Haskell 中,有两个函数允许对项目列表执行操作以将其减少为单个值。 (当然不止两个,但这是我感兴趣的两个。)它们是 foldl1foldr1 .如果要执行的操作是commutative (例如加法),您使用其中的哪一个都没有关系。结果将是相同的。但是,如果运算不是可交换的(例如减法),则两者会产生非常不同的结果。例如:

foldr1 (-) [1..9]
foldl1 (-) [1..9]

第一个的答案是 5,第二个的答案是 -43。 J 等效于 foldr1是插入副词, / ,例如,
-/ 1+i.9

这相当于 foldr1 (-) [1..9] .我想在 J 中创建一个副词,它的作用类似于插入副词,但向左折叠而不是向右折叠。我能想到的最好的方法如下:
foldl =: 1 : 'u~/@|.'

因此,可以说:
- foldl 1+i.9

并得到 -43 作为答案,这是对左折叠的预期。

在 J 中有没有更好的方法来做到这一点?出于某种原因,扭转了 y争论对我来说似乎没有效率。也许有一种方法可以做到这一点而不必诉诸那个。

最佳答案

我认为没有比您描述的更好的向左折叠方法了:

(v~) / (|. list)

这是一种非常自然的方式,几乎是定义的“字面”实现。反转列表的成本非常小(imo)。

实现左折叠的另一种明显方法是设置
new_list = (first v second) v rest

例如:
foldl_once =: 1 :'(u / 0 1 { y), (2}. y)'
foldl =: 1 :'(u foldl_once)^:(<:#y) y'

所以:
- foldl >:i.9
_43

但你的方式执行 在空间和时间上都比这更好。

关于j - 在 J 中实现 Haskell 的 foldl1 的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5208743/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com