【问题标题】:need help understanding this erlang code需要帮助理解这个 erlang 代码
【发布时间】:2009-10-15 14:08:49
【问题描述】:

我无法理解这条线。

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

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

【问题讨论】:

  • 把标题改成“Understanding List Comprehensions in Erlang”就好了。

标签: functional-programming erlang


【解决方案1】:

[something(X) || X &lt;- L],是一个列表理解。 L 是一个元素列表,这个表达式创建一个新元素列表,通过在其上调用 something() 来形成每个元素。

[something(X,Y) || X &lt;-L, Y&lt;-M] 类似,但为 X 和 Y 中每个元素的笛卡尔积创建了一个元素。

[something(X) || X &lt;-L, Expr] 是一个过滤器表达式。与第一个相同,但仅对 L 的元素执行,其中 Expr 对于给定的 X 为 true。

[something(X) || {X,..} &lt;-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 的那些元素除外,并且对于这些对中的每一个都将 {delete, V1a} 消息发送到PID2。

【讨论】:

    【解决方案2】:

    我不知道 Erlang,但这看起来就像我知道的一堆语言的列表推导。希望这个猜测对你有所帮助,直到知道 Erlang 的人可以回答:

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

    转换为命令式伪代码:

    For each item in PV1a, unpacking item to {Pid1a, V1a}
        For each Pid2 in P2
            If Pid1a /= Pid2
                Pid2 ! {delete, V1a} 
    

    也就是说,对于 PV1a 和 P2 中的每个 Pid,只要 Pid1 和 Pid2 不是同一个 Pid,就向 Pid2 发送删除 V1a 的消息。

    【讨论】:

    • 您能解释一下拆包部分吗?开箱是什么意思?
    • 这里我们使用模式匹配首先检查列表 PV1a 中的一个元素是否是两个元素的元组,然后将元组拆分成它的元素 Pid1a 和 V1a。模式匹配是 erlang 的基础,在 erlang 代码中无处不在。
    【解决方案3】:

    它是list comprehension

    看一个更流行的 LC 介绍示例;找到整数边的平方等于整数斜边的平方的三角形,但对于给定的整数范围Ns

    Ns = [1,2,3,4,5,6,7,8,9].
    [{X,Y,C} || X <- Ns, Y <- Ns, C <- Ns, X*X + Y*Y == C*C].
    

    这为我们提供了以下列表作为输出。

    [{3,4,5},{4,3,5}]
    

    这似乎是正确的:

    3² + 4² = 5²
    9 + 16 = 25
    25 = 25
    

    所以列表推导可以理解为给我们每个 X、Y 和 C,使得 X 取自 Ns,Y 取自 Ns,C 取自 Ns,X² + Y² 等于 C²。

    【讨论】:

      猜你喜欢
      • 2016-07-08
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2010-11-04
      相关资源
      最近更新 更多