# Something like math.min for tuple

One can use < with a tuple, at least if import scala.math.Ordering.Implicits._ is present. This doesn’t allow math.min to be used however, because it is only defined for mathy arguments. How can I write a def min[T](x: T, y: T): T with the correct <:, imports, implicits, and everything for it to work on a relatively generic pair of tuples?

If you have `import Ordering.Implicits._` you can even simply use the infix extension method `min`:

``````scala> import Ordering.Implicits._
import Ordering.Implicits._

scala> (1,2,3) min (1,2,2)
val res0: (Int, Int, Int) = (1,2,2)
``````

Or

``````scala> def min[T: Ordering](x: T, y: T): T = Ordering[T].min(x, y)
def min[T](x: T, y: T)(implicit evidence\$1: Ordering[T]): T

scala> min((1,2,3), (1,2,2))
val res0: (Int, Int, Int) = (1,2,2)
``````
1 Like

Thank you! I was missing at least this Ordering[T]. idea.

It’s a shortcut for `implicitly[Ordering[T]]`. It works because companion object `Ordering` has a method `def apply[T: Ordering] = implicitly[Ordering[T]]`. This allows you to write `Ordering.apply[T]` which can be shortened to `Ordering[T]`.

Another alternative is writing

``````def min[T](x: T, y: T)(implicit ord: Ordering[T]): T = ord.min(x, y)
``````
1 Like