Ratio - rational numbers in Elixir

Ratio

Ratio is a library to work with rational numbers (also known as ‘fractions’) in Elixir.

hex.pm version Documentation ci


A bit of history

Ratio has been around for a very long time. It was the first library I wrote when I started learning Elixir, with the first public release happening in March of 2016. (For Elixir v1.2. Oh, how the time flies!)

Throughout the years, my onlook on programming has changed a little, Elixir has changed a little, and the library changed to match.

From the start, Ratio allowed to use the <|> operator as shorthand notation to allow for a natural syntax like 1 <|> 2. Ratio also supported overloaded math operators, for the same reason.

This operator overloading was later moved to an ‘opt-in’ approach. Later, support was added to mix-and-match overloaded math operators for different kinds of number types, by extracting this functionality to the Numbers library.

Recently it came to my attention that <|> has been deprecated starting in Elixir v1.14.
And so, the library again had to slightly change.

Today

And this brings me to today. A release candidate for v4.0.0 of the library has been published to Hex.PM just now.
The important (backwards-incompatible) changes to v3.0.2 are:

  • Remove infix operator <|> as its usage is deprecated in Elixir v1.14.
  • Switch the Inspect implementation to use the form Ratio.new(10, 20) instead of 10 <|> 20.
  • Remove implementation of String.Chars, as the old implementation was not in a (non-programmer) human-readable format.

You can still use <|> or <~> (which is not deprecated in Elixir v1.14 and should stay around for a long time yet to come), by writing

defdelegate numerator <~> denominator, to: Ratio, as: :new

in your module.

For instance, here is an example of if you want to use the full opt-in syntactic sugary goodness:

defmodule IDoAlotOfMathHere do
  defdelegate numerator <~> denominator, to: Ratio, as: :new
  use Numbers, overload_operators: true

  def calculate(input) do
     num = input <~> 2
     result = num * 2 + (3 <~> 4) * 5.0
     result / 2
  end
end

iex> IDoAlotOfMathHere.calculate(42)
Ratio.new(183, 8)

Please try out the new release candidate of the library (by adding {:ratio, "4.0.0-rc.0"} to your deps), and let me know if you encounter any bugs or oddities!

~Marten / Qqwy

14 Likes

Release candidate 4.0.0-rc.1 has been released, which contains a fix for a regression where constructing a rational number from a decimal did not work.

2 Likes