Iron Type

Refined types are represented in Iron by IronType[A, C] where:

  • A is the base type
  • C is the constraint (or "refinement") attached to A.

For example, IronType[Int, Greater[0]] represents an Int that should be greater than zero (see Greater reference).

A more concise alias A :| C is often used instead. For instance, Int :| Greater[0] is equivalent to IronType[Int, Greater[0]]. This alias is close to the mathematical predicate operator | used in set builders.

Refined types are subtypes of their unrefined form. For instance, Int :| Greater[0] is a subtype of Int.

import io.github.iltotore.iron.*
import io.github.iltotore.iron.constraint.numeric.Greater

val x: Int :| Greater[0] = ???
val y: Int = x //Compiles

IronType[A, C] is an opaque type alias of A. Therefore, a refined type desugars to its "raw" type, making refined types overheadless.

import io.github.iltotore.iron.*
import io.github.iltotore.iron.constraint.numeric.Greater

val x: Int :| Greater[0] = ???

desugars to

val x: Int = ???

For further details about type refinement, see Refinement Methods. To create custom constraints, see Constraint reference.

In this article