Question

I have a type in Scala:

  type Fingerprint = Seq[(Int, Int)]

I would like to override the toString of this type. How can I do this?

Was it helpful?

Solution

There are good reasons to use a type class-based approach to this kind of problem instead of Scala's toString (which is arguably just an unpleasant hand-me-down from Java), and the fact that you can't bolt a toString on an arbitrary type is one of them. For example, you could write the following using Scalaz's Show type class:

import scalaz._, syntax.show._

implicit val fingerprintShow: Show[Fingerprint] = Show.shows(
  _.map(p => p._1 + " " + p._2).mkString("\n")
)

And then:

scala> Seq((1, 2), (3, 4), (5, 6)).shows
res0: String = 
1 2
3 4
5 6

There are also good reasons to prefer a type class-based approach to one based on implicit classes or other implicit conversions—type class instances are generally much easier to reason about and debug.

OTHER TIPS

Overriding toString may not be the best option here, but there is a simple alternative:

implicit class SeqAug[T <: (_, _)](val seq: Seq[T]) {
   def showInfo: String = {
      seq.map(p => p._1 + " " + p._2).mkString("\n") // or whatever you want.
   }
}
val x = Seq(("test" -> 5))
Console.println(x.showInfo)

You can even restrict the bound of the augmentation:

type Fingerprint = Seq[(Int, Int)]
implicit class SeqAug(val fingerprint: Fingerprint) {
  // same thing
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top