Dimension definitions
New (physical) dimensions can be introduced with the dimension
keyword. Similar to units, there are base dimensions (like length, time and mass) and dimensions that are derived from those base dimensions (like momentum, which is mass · length / time). Base dimensions are simply introduced by declaring their name:
dimension Length
dimension Time
dimension Mass
Derived dimensions need to specify their relation to base dimensions (or other derived dimensions). For example:
dimension Velocity = Length / Time
dimension Momentum = Mass * Velocity
dimension Force = Mass * Acceleration = Momentum / Time
dimension Energy = Momentum^2 / Mass = Mass * Velocity^2 = Force * Length
In the definition of Force
and Energy
, we can see that alternative definitions can be given. This is entirely optional. If specified, the compiler will make sure that all definitions are equivalent.
Custom dimensions
It is often useful to introduce ‘fictional’ physical dimensions. For example, we might want to do calculations with
screen resolutions and ‘dot densities’. Introducing a new dimension for dots then allows us to define units like dpi
without sacrificing unit safety:
dimension Dot
@aliases(dots)
unit dot: Dot
unit dpi = dots / inch
fn inter_dot_spacing(resolution: Dot / Length) -> Length = 1 dot / resolution
inter_dot_spacing(72 dpi) -> µm # 353 µm
There is also a shorthand notation for creating a new dimension and a corresponding unit:
unit book
@aliases(pages)
unit page
@aliases(words)
unit word
let words_per_book = 500 words/page × 300 pages/book
Here, the base unit definitions will implicitly create new dimensions which are capitalized
versions of the unit names (Book
, Page
, Word
). This allows you to count books, pages
and words independently without any risk of mixing them. The words_per_book
constant in this
examples has a type of Word / Book
.