8

次の Haskell 型のクラスとインスタンス:

class Able a where
  able :: a -> Int

instance Able Int where
  able x = x

は一般的に次のように Scala に変換されます。

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

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

Haskell では、一種のキャッチオール インスタンスを定義して、すべての Maybe 型のインスタンスを作成できるようになりました。

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

、などのインスタンスがある場合、これは 、 などのインスタンスAbleを定義します。Maybe IntMaybe BoolAbleIntBool

Scalaでそれを行うにはどうすればよいでしょうか?

4

1 に答える 1

12

ピア タイプのインスタンスの暗黙的なパラメーターからインスタンスを構築します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)
于 2016-02-15T22:09:28.667 に答える