2016-02-15 3 views
7

次Haskellの型クラスとインスタンス:Scalaは型クラス: "キャッチオール" の場合

class Able a where 
    able :: a -> Int 

instance Able Int where 
    able x = x 

は、一般的にそうようにスカラ座に翻訳されています

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

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

Haskellでは、私は今の並べ替えを定義することができますすべてのMaybe型のインスタンスを作成します。

これはインスタンスなどMaybe IntためAbleMaybe Boolなどの電子BoolIntのインスタンスAbleがあることを提供する、

はどのようにしてScalaでそれを行うのでしょうか?

答えて

11

ピアタイプAのインスタンスの暗黙のパラメータからインスタンスを構築します。例:

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

珍しい!どうもありがとうございました :) – scravy