erlang在列表中是否有隐藏的rownum?

erlang在列表中是否有隐藏的rownum?,erlang,Erlang,这是我当前代码的一个示例: DataSet = [1,2,3,4,5,6,7,8,9]. Sequence = [3,4,5,6]. ReducedDataSet = lists:foldl( fun(SeqNumber, Output) -> Row = lists:nth(SeqNumber, DataSet), [Row|Output]

这是我当前代码的一个示例:

DataSet = [1,2,3,4,5,6,7,8,9].

Sequence = [3,4,5,6].

ReducedDataSet = lists:foldl( fun(SeqNumber, Output) ->
                                 Row = lists:nth(SeqNumber, DataSet),
                                 [Row|Output]
                              end,
                              [],
                              Sequence
                             ).
ReducedDataSet的结尾是[6,5,4,3],如果我将其更改为lists:foldr,ReducedDataSet将是[3,4,5,6]

我没料到当从左向右吸收时,第三个值是3,应该继续到6,但当从右向左吸收时,第三个值将是7,继续到4


这是否意味着我的列表中有一个隐藏的行号,而foldl和foldr只是在最终列表的排序顺序上有所不同?

我认为这是一个更一般的
折叠问题

通常,fold执行以下操作:
(新元素,acc)->新元素acc

如果操作
new_element°acc
是可交换的(例如
sum
),则foldl和foldr是相同的

如果操作为“append”,则将元素追加到左侧或右侧是有区别的

[3]°4->[3,4]
VS
4°[3]->[4,3]

我不记得哪个是
foldl
foldr
,但我认为左/右指的是累加器的位置(
[3]°4
foldl
,根据这个定义)

TL;DR

不,Erlang列表中没有隐藏的索引或“行号”

讨论

在“列表是一堆conse”的函数列表的上下文中,进一步探讨列表操作的性质可能会有所帮助

不久前我写了一篇关于褶皱的解释,可能对你有用:

请记住,函数列表只有单向的指针。也就是说,它们是单链接列表。没有C样式数组中的“rownum”或“index”概念。每次调用
lists:nth/2
实际上是在返回第n个元素之前将列表遍历到该元素

如果我们想要一个因错误输入而崩溃的版本,我们可以这样编写
列表:nth/2
(查找结果如下):


(作为一个旁注,考虑…)

老实说,你的答案我意识到我在这里关注的是错误的事情。正如您所说,foldl和foldr只是确定添加到累积的新列表中的元素的位置,它的列表是:n,即使用静态原始数据集并确定每个位置。列表:第n个,第3个元素始终位于第3个位置,不管我对该元素做了什么,一旦我得到了它。认为这回答了我的问题,因为我问得最好。另一个答案是fold上的一个很好的快速提醒,但正如我自己意识到的,答案是要记住它是列表:n决定了列表中的位置。我也不喜欢我们目前如何编写多行函数——我上面写的只是反映了我们目前的做法。将您的链接发送给我的上级,看看它是否比我所能做到的更具说服力。@Philbo并非所有人都同意我的观点,分解事物是个好主意。我发现,通常命名良好的函数比内联FUN更容易处理(并在其他地方找到重用),而且在几乎所有情况下,为较大函数中的匿名函数指定一个有意义的标签几乎总是一个可读性的胜利。然而,随着时间的推移,这些可读性的胜利真的会累积起来,特别是当您重新编写一些旧代码时。至于一般风格,我根据可用的建议为此编写了一个示例项目:
nth(1, [Element | _]) ->
    Element;
nth(N, [_ | Rest]) when N > 1 ->
    lists:nth(N - 1, Rest).