• [^] # Re: Scala

    Posté par (site web personnel) . En réponse au journal Javascript plus rapide que python ! (une suite possible). Évalué à 1.

    Ça tombe bien, Josh Suereth vient de publier un article qui explique comment implémenter l'équivalent des "type classes" d'Haskell en Scala : http://suereth.blogspot.com/2010/07/monkey-patching-duck-typ(...) Ça se fait en combinant les "structural types" :
    scala> def pouet(a:{def ping: String}) = println("kekidi? " + a.ping)
    pouet: (a: AnyRef{def ping: String})Unit
    scala> class Yop {
     | def ping = "checku"
     | }
    defined class Yop
    scala> val truc = new Yop
    truc: Yop = Yop@1c45484a
    scala> pouet(truc) 
    kekidi? checku 
    
    Avec les traits :
    scala> trait MyTypeClass { 
     | def ping: String 
     | } 
    defined trait MyTypeClass 
    scala> def pouet(a:MyTypeClass) = println("kekidi? " + a.ping) 
    pouet: (a: MyTypeClass)Unit 
    scala> pouet(truc)
    :14: error: type mismatch;
     found : Yop
     required: MyTypeClass
     pouet(truc)
     ^
    
    Et avec les implicits. Si Yop supporte la type-class MyTypeClass, alors on définit un implicit comme ça :
    scala> implicit def yop_mtc(a:Yop): MyTypeClass = new MyTypeClass {
     | def ping = a.ping
     | }
    yop_mtc: (a: Yop)MyTypeClass
    
    Ce qui permet ensuite d'écrire, sachant que truc est de type Yop :
    scala> pouet(truc)
    kekidi? checku