 This week's LFE Friday was translated with permission from the Erlang Thursday series by Steven Proctor. This week's translator: Robert Virding.

Today’s LFE Friday function of the week is lists:any/2.

`lists:any/2` takes a predicate function as the first argument, and a list to iterate over as its second argument. `lists:any/2` returns `true` if the predicate function returns `true` for any of the elements in the given list, otherwise, `lists:any/2` returns `false`.

``````> (lists:any #'erlang:is_atom/1 '(1 2 3 4 5 6 7))
false
> (lists:any #'erlang:is_atom/1 '(1 2 3 4 a 6 7))
true
> (lists:any #'erlang:is_atom/1 '(#(1 2) 3 4 a 6 7))
true
> (lists:any (lambda (x) (== (rem x 2) 1)) '(1 2 4))
true
> (lists:any (lambda (x) (== (rem x 2) 1)) '(0 2 4))
false``````

`lists:any/2` is eager, and will return with a result of `true` as soon as it is found, and will ignore processing the rest of the list.

``````> (timer:tc 'lists 'any (list (lambda (x) (== (rem x 2) 1)) (lists:seq 2 200000 2)))
#(171661 false)
> (timer:tc 'lists 'any (list (lambda (x) (== (rem x 2) 0)) (lists:seq 2 200000 2)))
#(19 true)``````

The `lists` module also contains a function lists:all/2, similar to `lists:any/2`, but checks if the predicate function returns `true` for every element in the supplied list.

``````> (lists:all #'erlang:is_number/1 '(1 2 3 4 a 6 7))
false
> (lists:all #'erlang:is_number/1 '(1 2 3 4 5 6 7))
true``````

`lists:all/2` is also eager, and will return with a result of `false` as soon as it is found, and will ignore processing the rest of the list.

``````> (timer:tc 'lists 'all (list (lambda (x) (== (rem x 2) 0)) (lists:seq 2 200000 2)))
#(170436 true)
> (timer:tc 'lists 'all (list (lambda (x) (== (rem x 2) 1)) (lists:seq 2 200000 2)))
#(18 false)``````

–Proctor, Robert

04 January 2015

tutorials