2016-06-01 3 views
4

은 foreach 함수를 사용하여 콜백 함수에서 요소를 삭제할 수 있습니까? 즉, 반복이 일어나고있는 목록을 수정하는 경우 어떤 문제가있을 것입니다.얼랭 목록 : foreach 부작용

답변

6

나는이 간단한 대답은 아니오라고 생각합니다.

lists:foreach/2 함수는 목록의 모든 요소에 대해 특정 함수를 실행하는 데 사용됩니다. 이 외에도 ok 원자를 반환합니다. 문서에 정의 된대로 목록을 반환하지 않습니다.

foreach(Fun, List) -> ok
통화 List의 각 요소에 Elem에 대한 Fun(Elem). 이 함수는 부작용에 사용되며 평가 순서는 목록의 요소 순서와 동일하게 정의됩니다.

모든 요소에 대해 일부 기능을 수행하고이 기능의 결과와 함께 목록을 반환하려면 lists:map/2을 사용할 수 있습니다. foreach과 대비하여 map은 평가 순서를 보장하지 않습니다.

목록에서 요소를 삭제하려면 lists:delete/2을 사용하면됩니다.

+1

감사합니다. 나는 변수가 erlang에서 불변이라는 것을 잊었다. ** 부작용 **이 문서에서 의미하는 것은 무엇입니까? 문서에서 언급하는 부작용은 누구입니까? –

+2

부작용은 아무 것도 반환하지 않는다는 것을 의미하며, 반환 값에 신경 쓰지 않고 목록의 모든 요소에 대해 무언가를 실행하는 것입니다. 예를 들어'List'의 모든 요소를'Pid' 프로세스로 보내고 싶다면'foreach (fun (E) -> Pid! E end, List)'리스트를 할 수 있습니다. –

+0

https://en.wikipedia.org/wiki/Side_effect_%28computer_science%29 – Amiramix