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