spammy

spammy

Function Parameter Pattern Matching on multiple candidates?

Is it possible to match multiple parameters to a single function body? So for:

def foo("a" = word) do
  word
end
def foo("b" = word) do
  word
end
def foo("c" = word) do
  "not a or b!"
end

have a single definition for the first two, so something like:

def foo("a" = word) 
    foo("b" = word) do
  word
end
def foo("c" = word) do
  "not a or b!"
end

Marked As Solved

spammy

spammy

Thank you all for the insight but the intent of my post wasn’t about the patterns themselves (they were just arbitrary examples) but how to write a function headers with arbitrary patterns for a single body. Given the responses, I’m assuming it’s not possible. Therefore I guess an answer is:

def foo("a" = word) do: bar(word)
def foo("b" = word) do: bar(word)
defp bar(word) do
   word
end
def foo("c" = word) do
  "not a or b!"
end

Also Liked

kevinschweikert

kevinschweikert

You can use a guard for that

def foo(word) when word in [“a”, “b”] do
end
dimitarvp

dimitarvp

For a list starting with something, it’s trivial:

def foo([first | _rest]) when first in ["a", "b"] do
end

For a list ending with something, it’s more involved as the Erlang lists are single-linked lists (in the C lingo) and you have to traverse the entire list to find the ending:

def foo(list) when is_list(list) do
  if List.last(list) in ["a", "b"] do
    # all good, proceed
  else
    # report an error
  end
end

For this usually people make a public function that does these validations and handles returning errors and then define something like defp do_foo to handle the happy path only.

mudasobwa

mudasobwa

Creator of Cure

FWIW, the common convention name for bar should be do_foo as well.

To sum it all up:

def foo("a") do: do_foo("a")
def foo("b") do: do_foo("b")
def foo(word) do
  "not a or b!"
end

defp do_foo(word) do
  word
end

Where Next?

Popular in Questions Top

tduccuong
Hi, is there any work on GUI with Elixir, that is similar to Electron/Javascript? My idea is to bundle Phoenix and BEAM into a single se...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
hariharasudhan94
lets say i have a sample like a = 20; b = 10; if (a > b) do {:ok, "a"} end if (a < b) do {:ok, b} end if (a == b) do {:ok, "eq...
New
nobody
Hi! In PHP: $SERVER['SERVERADDR'] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
marick
I had some trouble figuring out how to make many-to-many associations work. Once I got it working, I wrote a blog post. Because I'm a nov...
New

Other popular topics Top

sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 42842 311
New
AstonJ
Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
AngeloChecked
What learn first? Rust or Elixir Hi Elixir community! I’m here because i want learn a new language. I’m a junior developer and mainly i ...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
boundedvariable
I am going through the kafka architecture. All the features what the kafka is providing are already in Erlang. I would like hear your opi...
New
joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 record...
New
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New

We're in Beta

About us Mission Statement