Size: a a a

2018 November 07

Е

Евгений in pro.elixir
А вот тру эликсировский с повышенной читабельностью:
defmodule QE do
 def solve(a, b, c) do
   case discriminant(a, b, c) do
     discriminant when discriminant >= 0 ->
       {
         root(a, b, :plus, discriminant),
         root(a, b, :minus, discriminant)
       }

     _ ->
       :error
   end
 end

 defp root(a, b, sign, discriminant) do
   case sign do
     :plus -> (-b + :math.sqrt(discriminant)) / (2 * a)
     :minus -> (-b - :math.sqrt(discriminant)) / (2 * a)
   end
 end

 defp discriminant(a, b, c) do
   b * b - 4 * a * c
 end
end
источник

(

( in pro.elixir
Евгений
А вот тру эликсировский с повышенной читабельностью:
defmodule QE do
 def solve(a, b, c) do
   case discriminant(a, b, c) do
     discriminant when discriminant >= 0 ->
       {
         root(a, b, :plus, discriminant),
         root(a, b, :minus, discriminant)
       }

     _ ->
       :error
   end
 end

 defp root(a, b, sign, discriminant) do
   case sign do
     :plus -> (-b + :math.sqrt(discriminant)) / (2 * a)
     :minus -> (-b - :math.sqrt(discriminant)) / (2 * a)
   end
 end

 defp discriminant(a, b, c) do
   b * b - 4 * a * c
 end
end
По-моему, слишком "C-affected", ничерта не тру эликсир
источник

(

( in pro.elixir
Вместо гибкого паттерн-матчинга какие-то кастрированные кейсы
источник

Е

Евгений in pro.elixir
да, ты прав, ща переделаем :)
источник

DR

Dmitry Russ (Aleksandrov) in pro.elixir
У меня, кстати, есть такой богомерзкий используемый, только с расчётом параболы и определения y координаты для 4-его x. Правда я не уверен, что мой код читабельный:

  @doc """
 Calculates 3 point parabolla to determinate some point in between.
 """
 def point_parabola({x1, y1}, {x2, y2}, {x3, y3}, x) do
   a =
     ((y2 - y1) * (x1 - x3) + (y3 - y1) * (x2 - x1)) /
       ((x1 - x3) * (:math.pow(x2, 2) - :math.pow(x1, 2)) +
          (x2 - x1) * (:math.pow(x3, 2) - :math.pow(x1, 2)))

   b = (y2 - y1 - a * (:math.pow(x2, 2) - :math.pow(x1, 2))) / (x2 - x1)
   c = y1 - a * :math.pow(x1, 2) - b * x1
   a * :math.pow(x, 2) + b * x + c
 end
источник

BB

Boris Beginin in pro.elixir
Выглядит довольно читабельно для меня
источник

Е

Евгений in pro.elixir
Ну ок, вот переделанный тру эликсировский, правда с неправославным with
defmodule QE do
 def solve(a, b, c) do
   with d <- discriminant(a, b, c),
        :ok <- check_discriminant(d) do
     {:ok, {root(a, b, d, :plus), root(a, b, d, :minus)}}
   else
     error -> error
   end
 end

 defp root(a, b, d, :plus) do
   (-b + :math.sqrt(d)) / (2 * a)
 end

 defp root(a, b, d, :minus) do
   (-b - :math.sqrt(d)) / (2 * a)
 end

 defp discriminant(a, b, c) do
   b * b - 4 * a * c
 end

 defp check_discriminant(d) when d < 0 do
   {:error, :no_rational_roots}
 end

 defp check_discriminant(_) do
   :ok
 end
end
источник

(

( in pro.elixir
defmodule SqEq do

 def solve(a, b, c) do
   b*b - 4*a*c
   |> root(a, b)
 end

 defp root(0, a, b), do:
   -b * b / (2 * a)
 
 defp root(dis, a, b) when dis < 0, do: :error
 
 defp root(dis, a, b), do:
   { val(dis, a, b, &Kernel.minus),
     val(dis, a, b, &Kernel.plus) }

 defp val(dis, a, b, action), do:
   action.(-b*b, Math.sqrt(dis)) / 2*a

end
источник

(

( in pro.elixir
Я типа не знаю, что там думать, когда есть благословенный паттерн-матчинг и пайпы
источник

Е

Евгений in pro.elixir
мало эликсировости, где railway error handling? но ход с action мне понравился :)
источник

Е

Евгений in pro.elixir
кода ошибки нет, тоже плохо
источник

(

( in pro.elixir
>defp root(dis, a, b) when dis < 0
источник

Е

Евгений in pro.elixir
нет, я про описание ошибки, типа надо возвращать кортеж с :error и кодом ошибки
источник

(

( in pro.elixir
ммм
источник

Е

Евгений in pro.elixir
пайпы, кстати, почти такие же неправославные как и with
источник

(

( in pro.elixir
Нет, это идиома эликсира
источник

(

( in pro.elixir
Поэтому православные
источник

(

( in pro.elixir
По-моему это в этом же чате и говорили, что эликсир противопоставляет "поток данных" композиции функций
источник

Е

Евгений in pro.elixir
что только в этом чате не говорили :)
источник

Е

Евгений in pro.elixir
эликсир ничего не противопоставляет, писать надо так, что бы было коротко и понятно
источник