具有泛型的Scala类型类

沙鲁克斯

我一直在使用Scala中的typeclass模式,但是当我使用的类型是泛型时,我无法弄清楚如何实现隐式伴侣对象。

例如,假设我已经为类型类定义了一个特征,该特征提供了将内容放入Boxes的功能。

case class Box[A](value: A)

trait Boxer[A] {
  def box(instance: A): Box[A]
  def unbox(box: Box[A]): A
}

implicit object IntBoxer extends Boxer[Int] {
  def box(instance: Int) = Box(instance)
  def unbox(box: Box[Int]) = box.value
}

def box[A : Boxer](value: A) = implicitly[Boxer[A]].box(value)
def unbox[A : Boxer](box: Box[A]) = implicitly[Boxer[A]].unbox(box)

这按预期工作,使我能够提供Boxer各种类型的实现。但是,我知道当我要操作的类型是泛型本身时该如何做。假设我希望能够Boxer在任何上使用我的Seq[A]objectScala中的s不能包含类型参数,因此我不知所措:

// Will not compile - object cannot have type arguments
implicit object SeqBoxer[A] extends Boxer[Seq[A]] { ... }

// Will not compile - 'A' is unrecognized
implicit object SeqBoxer extends Boxer[Seq[A]] { ... }

// Compiles but fails on execution, as this doesn't implement an implicit
// conversion for _specific_ instances of Seq
implicit object SeqBoxer extends Boxer[Seq[_]] {
  def box(instance: Seq[_]) = Box(instance)
  def unbox(box: Box[Seq[_]]) = box.value
}

// Will not compile - doesn't technically implement Boxer[Seq[_]]
implicit object SeqBoxer extends Boxer[Seq[_]] {
  def box[A](instance: Seq[A]) = Box(instance)
  def unbox[A](box: Box[Seq[A]]) = box.value
}

// Compiles, but won't resolve with 'implicitly[Boxer[Seq[Foo]]]'
// I had high hopes for this one, too :(
implicit def seqBoxer[A]() = new Boxer[Seq[A]] {
  def box(instance: Seq[A]) = Box(instance)
  def unbox(box: Box[Seq[A]]) = box.value
}

有什么方法可以支持泛型类型的隐式转换,而不必为每个内部类型隐式包含一个单独的对象

迈克尔·扎亚克(Michael Zajac)

实际上,您真的很亲密。您需要从中删除括号seqBoxer[A]否则,编译器会将其视为来自的隐式转换() => Boxer[Seq[A]],而不是简单的可用隐式Boxer[Seq[A]]为了达到良好的效果,将隐式方法的返回类型设为显式也是一个好主意。

implicit def seqBoxer[A]: Boxer[Seq[A]] = new Boxer[Seq[A]] {
  def box(instance: Seq[A]) = Box(instance)
  def unbox(box: Box[Seq[A]]) = box.value
}

scala> box(Seq(1, 2, 3))
res16: Box[Seq[Int]] = Box(List(1, 2, 3))

实际上,您可以使用相同的方法Boxer[A]为任何A创建泛型,以使其行为相同。

implicit def boxer[A]: Boxer[A] = new Boxer[A] {
    def box(instance: A): Box[A] = Box(instance)
    def unbox(box: Box[A]): A = box.value
}

scala> box("abc")
res19: Box[String] = Box(abc)

scala> box(List(1, 2, 3))
res20: Box[List[Int]] = Box(List(1, 2, 3))

scala> unbox(res20)
res22: List[Int] = List(1, 2, 3)

scala> box(false)
res23: Box[Boolean] = Box(false)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有接口类类型的泛型

来自分类Dev

具有继承的类类型的泛型列表的类

来自分类Dev

在Scala中使用具有泛型类型的lambda

来自分类Dev

具有隐式泛型类型的Scala模拟函数

来自分类Dev

类中具有2个泛型类型的方法,其中1个泛型类型

来自分类Dev

类中具有2个泛型类型的方法,其中1个泛型类型

来自分类Dev

具有类参数的泛型类型推断

来自分类Dev

具有动态类型数量的泛型类

来自分类Dev

使泛型类的函数仅接受具有相同泛型类型但受更多约束的参数

来自分类Dev

具有不同类型泛型参数的方法的泛型类

来自分类Dev

如何使用已知类型作为参数创建具有泛型的泛型类?

来自分类Dev

Scala 自类型和泛型类

来自分类Dev

在具有泛型类型的类中定义的数据类的类型提示

来自分类Dev

具有泛型类型的泛型集合生成

来自分类Dev

具有泛型类型的泛型集合生成

来自分类Dev

具有泛型构造函数的泛型类?

来自分类Dev

Java:具有泛型方法的泛型类

来自分类Dev

具有多个特征的泛型类型

来自分类Dev

创建具有泛型类型的函数

来自分类Dev

具有多个泛型类型的ArrayList?

来自分类Dev

具有泛型类型的contains()

来自分类Dev

具有泛型类型的属性

来自分类Dev

具有继承的类类型的泛型列表的类-多继承

来自分类Dev

如何在C#中将具有泛型类型的类转换为具有作为泛型类型的对象的类

来自分类Dev

没有类类型的泛型方法?

来自分类Dev

为什么实现具有类型约束的泛型接口的泛型类需要重复这些约束?

来自分类Dev

如何在C#中收集具有泛型类型的静态类的所有“实例”?

来自分类Dev

Scala:引用类的嵌套类型,它是泛型的类型参数

来自分类Dev

在运行时从对象的字符串名称创建具有泛型类型的类的实例和具有相同泛型类型的调用方法

Related 相关文章

  1. 1

    具有接口类类型的泛型

  2. 2

    具有继承的类类型的泛型列表的类

  3. 3

    在Scala中使用具有泛型类型的lambda

  4. 4

    具有隐式泛型类型的Scala模拟函数

  5. 5

    类中具有2个泛型类型的方法,其中1个泛型类型

  6. 6

    类中具有2个泛型类型的方法,其中1个泛型类型

  7. 7

    具有类参数的泛型类型推断

  8. 8

    具有动态类型数量的泛型类

  9. 9

    使泛型类的函数仅接受具有相同泛型类型但受更多约束的参数

  10. 10

    具有不同类型泛型参数的方法的泛型类

  11. 11

    如何使用已知类型作为参数创建具有泛型的泛型类?

  12. 12

    Scala 自类型和泛型类

  13. 13

    在具有泛型类型的类中定义的数据类的类型提示

  14. 14

    具有泛型类型的泛型集合生成

  15. 15

    具有泛型类型的泛型集合生成

  16. 16

    具有泛型构造函数的泛型类?

  17. 17

    Java:具有泛型方法的泛型类

  18. 18

    具有多个特征的泛型类型

  19. 19

    创建具有泛型类型的函数

  20. 20

    具有多个泛型类型的ArrayList?

  21. 21

    具有泛型类型的contains()

  22. 22

    具有泛型类型的属性

  23. 23

    具有继承的类类型的泛型列表的类-多继承

  24. 24

    如何在C#中将具有泛型类型的类转换为具有作为泛型类型的对象的类

  25. 25

    没有类类型的泛型方法?

  26. 26

    为什么实现具有类型约束的泛型接口的泛型类需要重复这些约束?

  27. 27

    如何在C#中收集具有泛型类型的静态类的所有“实例”?

  28. 28

    Scala:引用类的嵌套类型,它是泛型的类型参数

  29. 29

    在运行时从对象的字符串名称创建具有泛型类型的类的实例和具有相同泛型类型的调用方法

热门标签

归档