Scala vs Haskell typeclasses: "catchall" instances



以下 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 中,我现在可以定义一种 catch-all 实例,从而为所有 可能类型创建一个实例:

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

这为Maybe IntMaybe Bool等定义了Able的实例,前提是有一个实例Able用于IntBool等。

在Scala中如何做到这一点?

您将从对等类型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)

相关内容

  • 没有找到相关文章

最新更新