2016-02-15 20 views
7

Sau đây Haskell kiểu lớp và dụ:Scala vs Haskell typeclasses: "catchall" trường

class Able a where 
    able :: a -> Int 

instance Able Int where 
    able x = x 

thường được dịch sang Scala như vậy:

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

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

Trong Haskell tôi bây giờ có thể xác định một loại của trường hợp bắt tất cả và do đó tạo ra một thể hiện cho tất cả các loại Có thể:

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

Điều này định nghĩa một instanc e của Able cho Maybe Int, Maybe Bool vv với điều kiện là có một thể hiện Able cho Int, Bool vv

Làm thế nào người ta sẽ làm điều đó trong Scala?

Trả lời

11

Bạn sẽ xây dựng cá thể từ tham số ngầm cho phiên bản của loại ngang hàng A. Ví dụ:

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

khéo léo! Cảm ơn nhiều :) – scravy