2009-11-03 75 views
2

我有这样的Erlang代码:这个Erlang语句做了什么?

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

谁能请解释通俗地说整个语句?对于您的信息Condition是一项功能,Conditions是一个数组。 fun(Condition) ->Condition(Message) end是什么意思?以及not lists:any的含义。

+0

参考:http://www.erlang.org/doc/man/lists.html#any-2 – Zed 2009-11-03 10:00:53

+0

作为参考,这是一样的: 列表:所有(乐趣(条件) - >没有条件(消息)结束,条件)。 – 2009-11-03 12:18:02

+0

作为参考,这是德摩根定律之一的应用:) – Zed 2009-11-03 18:03:51

回答

6
fun(Condition) ->Condition(Message) end 

是函数Condition适用于Message的值(取为闭合对周围代码)lambda函数。

lists:any 

是一个函数,它的谓词和值的列表,并呼吁依次在每个值的谓词,并返回原子true如果任何谓词呼叫做。

总的来说,结果是原子true如果没有的功能Condition在用于Message值列表Conditions返回true

编辑 - 为lists:any

any(Pred, List) -> bool() 

类型添加文档:

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

返回true Pred(Elem)返回true列表中的至少一个元素Elem了。

+0

呃结果是倒置的(“不列出::任何(..” – Will 2009-11-03 08:07:37

+0

对于阅读困难:“总的来说,结果是真的,如果_none_ of条件函数返回true“ – 2009-11-03 08:20:59

+0

你编辑了你的帖子Steve?我没有看到'edit'diff的东西 – Will 2009-11-03 09:03:34

1

条件是需要消息并返回布尔值的东西,如果它符合某些条件。

代码经过条件的列表,如果其中任何说真的,那么它返回false,而其中如果所有说假的,它说真的。

大致翻译为verbose伪Python

这个代码看起来非常像一个Erlang实现chain-of-responsibility design pattern

背后,你在其他的答案有语法和STDLIB描述
def not_lists_any(Message,Conditions): 
    for Condition in Conditions: 
    if Condition(Message): 
     return False 
    return True 
1

一步。该消息(在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.