I prefer something like this:
```scala
  def *[R,C](that: Matrix2[R, C, V])(implicit ring: Ring[V]): Matrix2[R, C, V] = that match {
    case Product(left, right, _, _, _) =>
    case Hadamart(...
    case Sum(..
    case OneR(... // turn the scalar into a Matrix2[Unit, Unit, V] and return Product(scalarM, OneR)
    case OneC(... // turn the scalar into a Matrix2[Unit, Unit, V] and return Product(OneC, scalarM)
    case m: MatrixLiteral => timesLiteral(m) // handle literals here
  }
  def timesLiteral[R,C](that: MatrixLiteral[R, C, V])(implicit ring: Ring[V]): Matrix2[R, C, V]
```