functional-programming - 需要帮助理解这个 erlang 代码

标签 functional-programming erlang

我无法理解这条线。

[Pid2 ! {delete, V1a}
    || {Pid1a, V1a} <- PV1a, Pid2 <- P2, Pid1a /= Pid2
  ],

这是我的理解:
双管“||”之前的任何东西根据双管后的内容重复进行。所以带有删除原子的消息被重复发送到 Pid2。
我知道 '/=' 意味着不平等。我不明白 '<-' 是什么意思,最终整行是什么意思。

最佳答案

[something(X) || X <- L] , 是一个列表理解。 L是一个元素列表,这个表达式创建了一个新元素列表,通过调用 something() 来形成每个元素。
[something(X,Y) || X <-L, Y<-M]类似,但为 X 和 Y 中每个元素的笛卡尔积创建了一个元素。
[something(X) || X <-L, Expr]是一个过滤表达式。与第一个相同,但仅对 L 的元素执行,其中 Expr 对于给定的 X 为真。
[something(X) || {X,..} <-L, Expr]是另一种过滤器。在列表推导式中,仅采用元素可以匹配的那些元素。

要知道的另一件事是,这不仅可以用于生成另一个列表,还可以用于为每个元素执行命令。如果列表理解的结果不匹配,编译器将知道根本不生成列表。此行为可用于模仿 foreach来自其他语言。

一些例子:

1> [ X*2 || X <- [1,2,3] ].
[2,4,6]
2> [ X*Y || X <- [1,2], Y <- [3,4,5] ].
[3,4,5,6,8,10]
3> [ X*3 || X <- [1,2,3,4], X rem 2 == 0 ].
[6,12]
4> [ X || {a,X} <- [{a,1},{a,2},{b,3},{c,4}] ].
[1,2]

因此,您的代码生成来自 PV1a 的所有 {Pid1a, V1a} 元素和来自 P2 的 Pid2 元素的笛卡尔积,除了那些 Pid1a 等于 Pid2 的元素,并且对于这些对中的每一个都向 Pid2 发送 {delete, V1a} 消息。

关于functional-programming - 需要帮助理解这个 erlang 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1570100/

相关文章:

Java:非空方法作为映射值

erlang - 为什么 Elixir/Erlang 中的数据共享不适用于两个映射中的同一个元组

performance - Erlang(或 Elixir )性能(每秒请求数)比 jruby 慢?

functional-programming - 如何在 Rust 中组合函数?

PHP 函数式风格

functional-programming - Purescript 应用程序不执行

erlang - lhttpc 客户端错误

list - 根据元组的第二个元素对列表进行排序

erlang - 文件 :consult without the file part

java - 实现线程安全共享计数器的功能方法