首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内核,-/2奇怪的行为

内核,-/2奇怪的行为
EN

Stack Overflow用户
提问于 2019-02-04 20:13:31
回答 2查看 122关注 0票数 6

考虑以下代码:

代码语言:javascript
复制
iex|1 ▶ [:foo, :bar] -- [:foo, :bar]
#⇒ []

到现在为止还好。但是:

代码语言:javascript
复制
iex|2 ▶ [:foo, :bar] -- [] -- [:foo, :bar]
#⇒ [:foo, :bar]

更重要的是,这并不是从右到左的问题:

代码语言:javascript
复制
iex|3 ▶ [:foo, :bar] -- [:foo] -- [:foo, :bar] 
#⇒ [:foo, :bar]

iex|4 ▶ IO.inspect([:foo, :bar], label: "1") --
...|4 ▶   IO.inspect([:foo], label: "2") --
...|4 ▶   IO.inspect([:foo, :bar], label: "3")
#⇒ 1: [:foo, :bar]
#  2: [:foo]
#  3: [:foo, :bar]

#⇒ [:foo, :bar]

我漏掉了什么明显的东西吗?这里发生了什么事?不应该有任何魔法,因为Kernel.--/2只是简单地委托给:erlang.--(left, right)

为什么连续减法列表会导致noop?

FWIW,加上括号,一切正常工作:

代码语言:javascript
复制
iex|5 ▶ ([:foo, :bar] -- [:foo]) -- [:foo, :bar]
#⇒ []

更有趣:

代码语言:javascript
复制
iex|6 ▶ [:foo, :bar] -- [:foo] -- []  
#⇒ [:bar]
iex|7 ▶ [:foo, :bar] -- [:foo] -- [:foo]
#⇒ [:foo, :bar]
iex|8 ▶ [:foo, :bar] -- [:foo] -- [:bar]
#⇒ [:bar]

跟踪调查结果。简短的缩减设法设法遵循正确的联想语义学:

代码语言:javascript
复制
Enum.reduce([[:foo, :bar], [:foo], [:foo, :bar]], &Kernel.--/2)
#⇒ [:foo, :bar]

但是,具有显式函数的完整格式的函数不会。

代码语言:javascript
复制
Enum.reduce(
  [[:foo, :bar], [:foo], [:foo, :bar]],
  fn e, acc -> acc -- e end
)
#⇒ []
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-04 20:42:59

++--右结合运算。您的初始代码:

代码语言:javascript
复制
[:foo, :bar] -- [:foo] -- [:foo, :bar]

实际上被评估为

代码语言:javascript
复制
[:foo, :bar] -- ([:foo] -- [:foo, :bar])

如果采用括号中的内容:从[:foo]中删除元素列表,而删除的列表包含原始列表([:foo]),因此计算结果为空列表[]

然后从最左边的列表中删除这个空列表:

代码语言:javascript
复制
[:foo, :bar] -- []

这就给您留下了结果[:foo, :bar]

票数 5
EN

Stack Overflow用户

发布于 2019-02-05 08:28:44

Enum.reduce([[:foo, :bar], [:foo], [:foo, :bar]], fn e, acc -> acc -- e end)中,您不会遇到与[:foo, :bar] -- [:foo] -- [:foo, :bar]相同的问题,这是因为您将对每个元素进行操作,而不是同时对所有元素进行操作。

由于acc将从[]开始,因此对于每个元素,您将拥有:

#1 => [] - :foo,:bar = []

#2 => [] - :foo = []

#3 => [] - :foo,:bar = []

所以你最后会有一个空的列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54523667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档