2016-02-15 31 views
7

Poniżej Haskell klasy typu i przykład:Scala vs Haskell typeclasses "catchall" przypadki

class Able a where 
    able :: a -> Int 

instance Able Int where 
    able x = x 

powszechnie przeliczeniu na Scala tak:

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

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

Haskell można obecnie określić rodzaj z instancji typu catch-all, a tym samym utwórz instancję dla wszystkich typów typu Może:

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

To definiuje instancję e od Able dla Maybe IntMaybe Bool itp, pod warunkiem, że nie jest instancją Able dla Int, Bool itp

Jak można by zrobić w Scala?

Odpowiedz

11

Utworzenie instancji z niejawnego parametru dla instancji typu równorzędnego: A. Na przykład:

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

Pomysłowy! Dziękuję Ci bardzo :) – scravy