试图了解Elixir如何使用Enum.reduce,我将其插入看跌期权来观察输出。我不清楚为什么它首先执行第二个列表元素而不是第一个列表元素,然后独立地遍历所有其他列表元素。
:lists.foldl(&IO.puts("a#{&1} b#{&2}"), 1, [2,3,4])
(a和b就在那里验证订单)
查看来源,我认为它转化为
{{1}}
产生相同的结果。
其中1是初始累加器,如果我给它一个函数给它积累的东西,它会说除了" bok"之外的其他有趣的东西。
虽然反转那些初始值让我感到奇怪。我应该如何考虑减少实施?
答案 0 :(得分:3)
您正在使用Enum.reduce / 2功能。将列表的第一个元素视为累加器。只需在iex中输入h Enum.reduce/2
即可。您将获得以下输出
Invokes fun for each element in the collection passing that element and the
accumulator acc as arguments. fun's return value is stored in acc. The first
element of the collection is used as the initial value of acc. If you wish to
use another value for acc, use Enumerable.reduce/3. This function won't call
the specified function for enumerables that are 1-element long. Returns the
accumulator.
Note that since the first element of the enumerable is used as the initial
value of the accumulator, fun will only be executed n - 1 times where n is the
length of the enumerable.
Examples
┃ iex> Enum.reduce([1, 2, 3, 4], fn(x, acc) -> x * acc end)
┃ 24
第二段应澄清您的疑问
请注意,因为可枚举的第一个元素用作初始元素 累加器的值,乐趣只会执行n - 1次,其中n是 可枚举的长度。
答案 1 :(得分:2)
有Enum.reduce/2
个Enum.reduce/3
个函数,Enum.reduce/3
和Enum.reduce/2
。 /3
是通常的reduce函数,它采用可枚举的初始累加器和减少函数。 def reduce([first|rest], fun), do: reduce(rest, first, fun)
与ftpsync
非常相似,但会跳过初始累加器,而是将可枚举中的第一个元素作为累加器,对于列表,它可以实现为:pkg install ftpsync
。