我不清楚如何在以下代码段中实现路径依赖类型。目的是能够使用“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
答案 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
,返回类型也符合。
这样,方法中的HeapImpl
和A
与H
中定义的相同。与路径相关的类型意味着您可以编写类似type ...
的类型(其中heap.A
是heap
)。
我还会注意到Heap
的实现看起来很奇怪。看起来您要将meld
的元素插入到h2
中(如果没有,h1
的第二个参数是什么意思?),但是然后返回insert
而不是返回h1
this
。