OK here's one useful example - implicit parameters. Every method can have its last parameter list marked as implicit
, which means that the compiler will automatically provide the needed arguments if it finds them in scope. If you have parameters other than the implicit ones, they have to be in a separate parameter list preceding the implicit one, which means that the method needs to be curried.
class MyClass(val value: String) {}
implicit def intToString(i: Int) = i.toString
implicit def doubleToString(d: Double) = d.toString
implicit def myClassToString(m: MyClass) = m.value
def append[T](t: T, s: String)(implicit ev: T => String) = t + s
val result1 = append(3, " is now a string")
val result2 = append(3.5, " is now a string")
val result3 = append(new MyClass("myClass"), " is now a string")