przemyxe0p

przemyxe0p

Hi,
I am wondering why my solution wil not work

1. source: Perfect Numbers in Elixir on Exercism

2. solution attempt:

  @spec classify(number :: integer) :: {:ok, atom} | {:error, String.t()}
  def classify(number) do
    case aliquot_sum(number) do
      number -> ok(:perfect)
      x when x > number -> ok(:abundant)
      x when x < number -> ok(:deficient)
    end
  end

  defp ok(item), do: {:ok, item}
  defp aliquot_sum(number), do: get_divisors(number) |> Enum.sum()

  defp get_divisors(number, divisor \\ 1, acc \\ [])
  defp get_divisors(number, divisor, acc) when divisor > div(number,2), do: acc
  defp get_divisors(number, divisor, acc) when rem(number, divisor) == 0,
    do: get_divisors(number, divisor + 1, [divisor | acc])
  defp get_divisors(number, divisor, acc), do: get_divisors(number, divisor + 1, acc)
end

3. question:

Complier is saying:

this clause cannot match because a previous clause at line 15
always matchesElixir
perfect_numbers.ex(15, 7): related

and

variable "number" is unused (there is a variable with the same name in the
context, use the pin operator (^) to match on it or prefix this variable 
with underscore if it is not meant to be used)Elixir

Why is that, why it cannot match with number passed to function?

Showing Posts 1 to 10

krasenyp

krasenyp

The first case clause matches any number. The clauses’ order matters.

przemyxe0p

przemyxe0p OP

But I used the same variable name in function clause, so I would expect that It would match against it

krasenyp

krasenyp

Oh, I get you now. You can use the pin operator ^number.

kokolegorille

kokolegorille

No, your logic is wrong and number might not be what You think…

As soon as there is a match, the rest of the case is discarded

the number in the case is not the number parameter, it is a new number

You probably should write this with cond

aliquot = aliquot_sum(number)
cond do
  aliquot > number -> ...
  aliquot < number -> ...
  aliquot == number -> ...
end
przemyxe0p

przemyxe0p OP

After adding ^ operator it’s right why should I use cond? What is more “idiomatic” whatever this “idiomatic” word mean? :smiley:

kokolegorille

kokolegorille

Because it’s very rare to use ^number in the case :slight_smile:

Yet, You can do as You like

krasenyp

krasenyp

In my experience it’s very rare to use cond but it’s still valid.

przemyxe0p

przemyxe0p OP

Last question, i cannot find explanatio why this works that way. Do you have explanation or link to resources?

sodapopcan

sodapopcan

People have a weird aversion to cond for some reason that I don’t really understand. Doing pure boolean checks is exactly what it exists for. The case version is essentially the same with unnecessary extra syntax. Using cond gives added information that indeed all clauses are boolean checks. It’s only rare because this doesn’t come up as often in Elixir, but it certainly does come up!

Where Next? Top

Trending in Questions Top

itzmidinesh
Hi all, I’m working on a Phoenix project where I need to make external HTTP requests and I’m trying to choose between Req and HTTPoison....
New
yarrichar
I’m very new to Elixir, so sorry if this is a silly question: I am wondering what happens to the mailbox of a process when the machine i...
New
pragdave
How do I tell Hologram not to escape HTML when substituting into templates? {Textile.render(@product.long_description)} escapes the HTM...
New
Fl4m3Ph03n1x
Background When trying to execute mix release on a Windows 11 machine for a Phoenix project I get the following error: * assembling mark...
New
rlipscombe
I’d like to create a file with 600 permissions (rw-------), but there’s a race condition if I create it and then change the permissions. ...
New
saleyn
Is there a way to import record definitions in the iex shell for pretty printing (similar to the rr command in the erl shell)? This woul...
New
rlipscombe
When I use Mix.install with a git dependency, using git@github.com:... how do I change the SSH identity used? I’ve got two Github accoun...
New

Other Trending Topics Top

dominicletz
Hey there, I haven’t seen a list of useful Elixir specific skills for the popular AI tools yet so I’m starting one here with my first. ...
New
raa-ziq
Hi everyone :waving_hand: I wanted to share something I’ve been building — NowBlind, a random chat app designed to help people discover ...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
OndrejValenta
(I just needed to vent somewhere and LinkedIn is full of hope, or hype, I’m not sure which exactly) AI dream has many faces, but general...
New
kip
Localize is the next generation localisation library for Elixir. Think of it as ex_cldr version 3.0. The first version will be released ...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews