```scala object TypeClasses5 { trait Show[A] { def show(a: A): String } object Show { private def instance[A](f: A => String): Show[A] = new Show[A] { def show(a: A): String = f(a) } implicit val intCanShow: Show[Int] = instance(int => s"int $int") implicit val stringCanShow: Show[String] = instance(str => s"string $str") implicit class ShowOps[A: Show](val a: A) { def show = Show[A].show(a) } def apply[A](implicit sh: Show[A]): Show[A] = sh def show[A:Show](a: A) = Show[A].show(a) } def main(args: Array[String]): Unit = { import Show._ println( show(20) ) println( show("Hello") ) println( 40.show ) println( "Hello world".show ) } } ```