Scala 与 Haskell 类型类:"catchall" 个实例
Scala vs Haskell typeclasses: "catchall" instances
以下 Haskell 类型 class 和实例:
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
这为Maybe Int
、Maybe Bool
等定义了一个Able
的实例,前提是Int
、[=]有一个实例Able
20=],等等
在 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)
以下 Haskell 类型 class 和实例:
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
这为Maybe Int
、Maybe Bool
等定义了一个Able
的实例,前提是Int
、[=]有一个实例Able
20=],等等
在 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)