scala - 基于原点的约束函数(路径依赖类型?类型生成?)

标签 scala path-dependent-type

抱歉标题太糟糕了,不确定有没有更好的。这是我的问题的粗略简化(对不起,如果它看起来微不足道,毫无意义):

class RList[T](data: List[T]) {
   def map[V](f: T=>V): RList[V] = ...
}

一个 RList 的想法(Restricted List) 就是你不能调整它的大小,也不能改变其中元素的顺序。但是您可以使用为您提供一个包含更改数据的新 RList 的函数。

现在需要有一个函数来创建 RLists。它可能有一个类似的签名:
def toRList[T](values: List[T]): RList[T] = ...

到现在为止还挺好。但现在是棘手的部分。我需要一个像这样工作的函数:
def zip[T, V](left: RList[T], right: RList[V]): RList[(T,V)]

但是附加的约束是 leftright有相同的起源。因此,它们可以保证大小相同。

例如应该编译的代码:
val x = toRList(List(1, 2, 3))
val y = x.map(_ * 2)
val z = y.map(_.toString)
zip(y,z)

例如应该无法编译的代码
val y = toRList(List(2, 4, 6))
val z = toRList(List("one", "two"))
zip(y,z)

*注意:在我原来的问题中,对 zip 的约束需要是它们来自同一个“来源”。仅仅保证它们的长度是不够的(更不用说,在编译时不知道列表的大小)*

我还需要能够使用 zip多次,所以应该编译这样的东西
zip(a,zip(b,c))

(假设 abc 来自同一来源)

谢谢!

最佳答案

这对你有用吗?

object PathDependentTypes {
  trait RListProducer {
    trait RList[T] {
      def map[V](f: T => V): RList[V]
      def zip[V](r: RList[V]) : RList[(T, V)]
    }
    def getList[T]: RList[T] = ???
  }

  class A extends RListProducer

  def main(args: Array[String]) {
    val aSource = new A
    val a = aSource.getList[Int]
    val anotherSource = new A
    val b = anotherSource.getList[String]

    val m1 = a.map( _ * 2)
    val m2 = a.map( _.toString)

    val z1 = m1.zip(m2)
    //val z2 = a.zip(b) //doesn't compile because A and B aren't the same.
    val z3 : A#RList[(Int, (Int, String))] = a zip (m1 zip m2)
  }
}

关于scala - 基于原点的约束函数(路径依赖类型?类型生成?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12025604/

相关文章:

Scala:不变性和依赖路径的类型兼容性

list - Scala使用排列列表进行统一交叉操作的最佳方法?

algorithm - 通过位掩码进行二进制搜索?

scala - 为什么 Scala 2.9.1 没有实现 NodeSeq 也是 GenTraversableOnce

scala - 路径依赖类型是子类型吗?

scala - 如何在 Scala 中使用具有类型类的路径相关类型

scala - 引用透明度

scala - () => Int 和 Unit => Int 之间有什么区别? Scala 中的 "()"到底是什么类型?

scala - 无法证明与路径相关类型的等效性

scala - Scala 中类值内的路径依赖类型