2016-04-18 8 views
3

Ich versuche, einfache Klassenmuster zu implementieren. Es wird angenommen, dass es ähnlich wie die Typklassen von scalaz funktioniert. Leider kann ich es nicht zur Arbeit bringen. Ich habe StrScala Typeclasses

trait Str[T] { 
    def str(t: T): String 
} 

object Str { 
    def apply[T](implicit instance: Str[T]) : Str[T] = instance 
} 

Und in meiner und impliziten Instanz davon trait.

object Temp extends App { 

    implicit val intStr = new Str[Int] { 
    def str(i: Int) = i.toString 
    } 

    1.str //error: value str is not a member of Int 

} 

Ich würde jede Einsicht schätzen.

+0

Sollte es nicht sein 'Str (1) .str'? Du hast keine 'implizite Klasse' definiert, nur ein' Objekt' mit 'apply'. –

Antwort

8

Alles, was Sie jetzt tun können, ist

Str[Int].str(1) 

verwenden 1.str Sie implizite Konvertierung einführen müssen.

können Sie zum Beispiel diesen Ansatz:

implicit class StrOps[A](val self: A) extends AnyVal { 
    def str(implicit S: Str[A]) = S.str(self) 
} 

Welche gibt:

scala> 1.str 
res2: String = 1