Scala递归类型和类型构造函数实现
发布时间:2020-12-16 18:47:23 所属栏目:安全 来源:网络整理
导读:我有一种情况,我需要一个可以采用类型的方法: Array[Int]Array[Array[Int]]Array[Array[Array[Int]]]Array[Array[Array[Array[Int]]]]etc... 让我们称这种类型的RAI为“递归的整数数组” def make(rai: RAI): ArrayPrinter = { ArrayPrinter(rai) } 其中Arr
我有一种情况,我需要一个可以采用类型的方法:
Array[Int] Array[Array[Int]] Array[Array[Array[Int]]] Array[Array[Array[Array[Int]]]] etc... 让我们称这种类型的RAI为“递归的整数数组” def make(rai: RAI): ArrayPrinter = { ArrayPrinter(rai) } 其中ArrayPrinter是一个用RAI初始化并迭代整个rai的类(假设它打印了这个数组中的所有值[Array [Int]]) val arrayOfArray: Array[Array[Int]] = Array(Array(1,2),Array(3,4)) val printer: ArrayPrinter[Array[Array[Int]]] = make(arrayOfArray) printer.print_! // prints "1,2,3,4" 它还可以返回原始Array [Array [Int]]而不会丢失任何类型信息. val arr: Array[Array[Int]] = printer.getNestedArray() 你如何在Scala中实现这一点? 解决方法
让我们首先关注类型.根据您的定义,类型T应该作为ArrayPrinter的参数进行类型检查,它是由以下类型函数接受的:
def accept[T]: Boolean = T match { // That's everyday business in agda case Array[Int] => true case Array[X] => accept[X] case _ => false } 在Scala中,您可以使用隐式解析对该类型函数进行编码: trait RAI[T] object RAI { implicit val e0: RAI[Array[Int]] = null implicit def e1[T](implicit i: RAI[T]): RAI[Array[T]] = null } case class ArrayPrinter[T: RAI](getNestedArray: T) // Only compiles it T is a RAI 要打印东西,最简单的解决方案是将rai:T视为rai:任何: def print_!: Unit = { def print0(a: Any): Unit = a match { case a: Int => println(a) case a: Array[_] => a.foreach(print0) case _ => ??? } } 你也可以想象并写print_!使用类型类,但这可能效率较低,并且需要花费更多时间来编写以上内容…作为读者的练习;-) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |