【问题标题】:What does this Erlang statement do?这个 Erlang 语句有什么作用?
【发布时间】:2010-12-12 13:21:15
【问题描述】:

我有这个Erlang 代码:

not lists:any(fun(Condition) ->Condition(Message) end, Conditions).

谁能用外行的方式解释整个声明?供您参考,Condition 是一个函数,Conditions 是一个数组。 fun(Condition) ->Condition(Message) end 是什么意思?以及not lists:any的含义。

【问题讨论】:

  • 供参考,同:lists:all(fun(Condition) -> not Condition(Message) end, Conditions)。
  • 供参考,这是德摩根定律之一的应用:)

标签: erlang


【解决方案1】:
fun(Condition) ->Condition(Message) end

是一个 lambda 函数,它将函数 Condition 应用于 Message 的值(作为周围代码的闭包)。

lists:any 

是一个函数,它接受一个谓词和一个值列表,依次调用每个值的谓词,如果有任何谓词调用,则返回原子true

总的来说,如果Conditions 列表中的任何Condition 函数都没有返回trueMessage 值,则结果是原子true

编辑——为lists:any添加文档

any(Pred, List) -> bool()

类型:

Pred = fun(Elem) -> bool()
 Elem = term()
List = [term()]

如果Pred(Elem) 为 List 中的至少一个元素 Elem 返回 true,则返回 true。

【讨论】:

  • eh 结果是倒置的 ("not lists::any(.."
  • 难以阅读:“总的来说,如果 none 的 Condition 函数返回 true,则结果为 true”
  • 您编辑了您的帖子史蒂夫?我没有看到“编辑”差异。
  • 是的——我添加了以“EDIT——”开头的部分
  • 然而 wiki diff 的东西没有显示(对我来说)。任何人都可以看到它?只有我发誓我看到你在编辑之前把它倒过来了,但如果你现在告诉我我很难阅读,我会相信你;)
【解决方案2】:

条件是接受消息并在满足某些条件时返回布尔值的东西。

代码遍历条件列表,如果任何个条件为真,则返回假,如果所有个条件为假,则为真。 p>

大致翻译成冗长的伪Python

def not_lists_any(Message,Conditions):
  for Condition in Conditions:
    if Condition(Message):
      return False
  return True

【讨论】:

    【解决方案3】:

    您在其他答案中的语法和标准库描述落后一步:

    这段代码看起来很像chain-of-responsibility design pattern 的Erlang 实现。消息(在OOP sense of the word 中)“遍历”所有可能的处理程序(来自Conditions 数组的函数),直到有人可以处理它。按照作者的约定,处理消息的返回true(否则返回false),所以如果没有人可以处理消息,那么你的表达式作为一个整体的结果是true

    % this is your code wrapped in a function
    dispatch(Message, Handlers) ->
        not lists:any(fun(Condition) ->Condition(Message) end, Handlers).
    

    可以这样使用:

    CantHandle = dispatch(Event, Handlers),
    if CantHandle->throw(cannot_handle); true->ok end.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      相关资源
      最近更新 更多