Noob到scala路径依赖类型

时间:2014-02-26 04:05:40

标签: scala traits path-dependent-type

我不清楚如何在以下代码段中实现路径依赖类型。目的是能够使用“meld”方法合并两个堆。 AFAIK需要路径依赖类型。

这是特质

trait Heap {
  type H // type of a heap
  type A // type of an element
  def ord: Ordering[Heap#A] // ordering on elements
  def meld(h1: Heap#H, h2: Heap#H): Heap#H // the heap resulting from merging h1 and h2
 ..
}

以下是实施的一部分

class HeapImpl extends Heap {

  override type H = HeapImpl // this.type
  override type A = Integer
  ..

  // the heap resulting from inserting x into h
  override def meld(h1: Heap#H, h2: Heap#H): Heap#H = {
    while (!isEmpty(h2)) {
      insert(deleteMin(h2),h1)
    }
    this
  }

meld方法的返回值“this”会遇到编译错误:

Expression HeapImpl does not conform to expected type Heap#H

2 个答案:

答案 0 :(得分:2)

投影堆#H与此不同.H。

scala> trait Heap { type H ; type A ; def m(h1: H, h2: H): H }
defined trait Heap

scala> class Impl extends Heap { type H = Impl; def m(h1: H, h2: H) = this }
defined class Impl

答案 1 :(得分:1)

trait Heap {
  type H <: Heap // type of a heap (added requirement that it must be a heap)
  type A // type of an element
  def ord: Ordering[A] // ordering on elements
  def meld(h1: H, h2: H): H // the heap resulting from merging h1 and h2
 ..
}

现在,当您定义

override def meld(h1: H, h2: H): H
<{1>}中的

HeapImpl只是H,返回类型也符合。

这样,方法中的HeapImplAH中定义的相同。与路径相关的类型意味着您可以编写类似type ...的类型(其中heap.Aheap)。

我还会注意到Heap的实现看起来很奇怪。看起来您要将meld的元素插入到h2中(如果没有,h1的第二个参数是什么意思?),但是然后返回insert而不是返回h1 this