Dlaczego w Elixirze są dwa rodzaje funkcji?
Uczę się Elixira i zastanawiam się, dlaczego ma dwa rodzaje definicji funkcji:
- funkcje zdefiniowane w module za pomocą
def
, wywołane za pomocąmyfunction(param1, param2)
- funkcje anonimowe zdefiniowane za pomocą
fn
, wywołane za pomocąmyfn.(param1, param2)
Tylko drugi rodzaj funkcji wydaje się być obiektem pierwszej klasy i może być przekazany jako parametr do innych funkcji. Funkcja zdefiniowana w module musi być zawinięta w fn
. Jest trochę cukru składniowego, który wygląda jak otherfunction(myfunction(&1, &2))
w kolejności aby to ułatwić, ale dlaczego jest to konieczne w pierwszej kolejności? Dlaczego nie możemy po prostu zrobić otherfunction(myfunction))
? Czy tylko po to, aby umożliwić wywołanie funkcji modułu bez nawiasu, jak w Ruby? Wydaje się, że odziedziczył tę cechę po Erlangu, który ma również Funkcje modułów i zabawy, więc czy rzeczywiście pochodzi ona od tego, jak maszyna wirtualna Erlang działa wewnętrznie?
Czy istnieje jakaś korzyść z posiadania dwóch typów funkcji i konwersji z jednego typu do drugiego, aby przekazać je do innych funkcji? Czy istnieje korzyści posiadanie dwóch różnych notacji do wywoływania funkcji?