2016-02-15 33 views
7

aşağıdaki Haskell tipi sınıf ve örnek:Scala typeclasses: "tümünü yakalama" örnekleri

class Able a where 
    able :: a -> Int 

instance Able Int where 
    able x = x 

yaygın şöyle Scala çevrilir:

trait Able[A] { 
    def able(a: A): Int 
} 

implicit object AbleInt extends Able[Int] { 
    def able(a: Int) = a 
} 

Haskell'de şimdi bir tür tanımlayabilir örneğini tümünü yakalama ve böylece bütün Belki türleri için bir örneğini oluşturun:

instance Able a => Able (Maybe a) where 
    able (Just a) = able a 
    able Nothing = 0 

Bu instanc tanımlar vb Maybe Int, Maybe Bool için Able e

İnsan nasıl Scala in bunu vb Int, Bool için bir örnek Able olması kaydıyla?

cevap

11

Örnek, eşdüzeyli tür A örneği için örtülü bir parametreden yapılandırabilirsiniz. Örneğin:

implicit def AbleOption[A](implicit peer: Able[A]) = new Able[Option[A]] { 
    def able(a: Option[A]) = a match { 
    case Some(x) => peer.able(x) 
    case None => 0 
    } 
} 

assert(implicitly[Able[Option[Int]]].able(None) == 0) 
assert(implicitly[Able[Option[Int]]].able(Some(3)) == 3) 
+0

Ustaca! Çok teşekkür ederim :) – scravy