tpucci

tpucci

Redefining functions?

Good morning,

First, I am a new learner and this is my first post ! I am really happy to join the community.

I am discovering Elixir syntax and I had a quick question:

Why can’t I use this syntax ?

Enum.all?([1, 30], is_number) 

If I do this I get the following error

** (CompileError) iex:9: undefined function is_number/0
(stdlib) lists.erl:1354: :lists.mapfoldl/3
(stdlib) lists.erl:1355: :lists.mapfoldl/3

I expected Elixir to find is_number/1

Instead, this works:

Enum.all?([1, 30], &is_number(&1))
Enum.all?([1, "hi"], fn x -> is_number(x) end)

Most Liked

david_ex

david_ex

Functions in Elixir have both a name AND an arity (number of arguments it takes). For Elixir to find the function, it needs both. Therefore, if you use the & capture operator, you also need to specify the function’s arity:

Enum.all?([1, 30], &is_number/1)

With your previous syntax of Enum.all?([1, 30], is_number), Elixir doesn’t know the function’s arity. In this case, there is only one version of is_number, but other functions with the same name can have different arities, e.g. List.flatten/1 and List.flatten/2.

In Elixir, a function’s “identity” is composed of BOTH its name and arity. This is why you’ll see functions referred to as is_number/1 and not just is_number.

kokolegorille

kokolegorille

The question is more about why You need to use & than function arity.

Probably because

is_number(x)

has the same result as

fn x -> is_number(x) end

and You might wonder why wrapping this inside fn → end.

But as soon as there is more than one params… You see it starts to be clearer why the 2 forms are differents.

There is another reason, fn allows to capture the present value of variables in the scope (Closure).

iex> a = 2
2
iex> myfunc = fn x -> a * x end
#Function<6.127694169/1 in :erl_eval.expr/5>
iex> a = 3
3
iex> Enum.map([1, 2], &myfunc.(&1))
[2, 4]

This last example is like having

fn x -> fn x -> a * x end end

It’s really fun to create functions from other functions so easily :slight_smile:

Where Next?

Popular in Chat/Questions Top

peerreynders
Manning 2016 Halloween weekend sale via Deal of the Day Friday, October 28 - Half off all MEAPs - code WM102816LT Saturday, October 29 ...
332 31254 154
New
Fl4m3Ph03n1x
Background I have been reading quite a lot about design and architecture in Elixir and overall FP. My latest incursions took to me the On...
New
New
aswinmohanme
I recently finished the Udemy course on Elixir and Phoenix and I am thinking about using it for the next project. But I am stuck as how t...
New
miguelsrrobo
hi i was wondering if it is necessary to learn erlang to learn elixir
New
zeroexcuses
Besides https://elixir-lang.org/getting-started/basic-types.html are there any other well recommended “elixir by example” style resources...
New
stevensonmt
I’d like to provide my review of the Elixir Course module from Groxio. I have some criticisms but I’d like to start with the positives. ...
New

Other popular topics Top

rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
chrismccord
Phoenix 1.4.0 released Phoenix 1.4 is out! This release ships with exciting new features, most notably with HTTP2 support, improved deve...
688 31525 112
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 44608 311
New

We're in Beta

About us Mission Statement