这个Erlang声明做了什么?

时间:2009-11-03 07:44:01

标签: erlang

我有这个Erlang代码:

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

任何人都可以用外行的话解释整个声明吗?对于您的信息,Condition是一个函数,Conditions是一个数组。 fun(Condition) ->Condition(Message) end是什么意思?以及not lists:any的含义。

3 个答案:

答案 0 :(得分:6)

fun(Condition) ->Condition(Message) end

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

lists:any 

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

总的来说,如果列表true中的Condition个函数都没有为Conditions值返回true,则结果为原子Message

编辑 - 添加lists:any

的文档
any(Pred, List) -> bool()

类型:

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

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

答案 1 :(得分:1)

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

代码遍历条件列表,如果其中任何表示为true,则返回false,如果所有,则表示false,则表示为true。

大致翻译为详细的伪 - Python

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

答案 2 :(得分:1)

在其他答案中,语法和stdlib描述落后一步:

此代码看起来非常像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.