2016-03-08 28 views
0

在Okasaki的“纯粹功能数据结构”中,有一种情况是我们创建一个带有类型字段的类,该类型是该类型参数的类型参数。源存在ML:如何在Scala中使用类型的成员?

trait Queue[E, Q] { 
    def empty: Q 

    def isEmpty: Q => Boolean 

    def snoc: (Q, E) => Q 

    def head: Q => E 

    def tail: Q => Q 
} 

所以我们基本上有一个:

signature Queue 
do 
    type α Queue 

    (* some methods *) 
end 

在Scala中,我把它与Queue[E, Q],其中E代表α和Q是原Queue成员类型模型定义轴承结构Q和元件E的操作。这工作对我蛮好了好一阵子,直到我遇到了一个CatenableList

functor CatenableListFromQueue(Q : Queue): CatenableList = 
struct 
    datatype α Cat = E | C of α × α Cat susp Q.Queue 

    (* some methods *) 
end 

现在datatype α Cat = E | C of α × α Cat susp Q.Queue似乎并没有很好地成为斯卡拉模型:它需要像

sealed trait Cat[+E, +Q[E, _]] 

object Empty extends Cat[Nothing, Nothing] 

case class C[E, Q](x: E, q: Q[Susp[Cat[E]], ???]) extends Cat[E, Q] 

但这要求类型构造函数Q[_, ???]可用;注意,我们希望拥有元素类型,同时让调用者选择轴承结构。

在Haskell,这看起来很简单:

data CatList q a = E | C a (q (CatList q a)) 

instance Queue q => CatenableList (CatList q) where 
    -- methods 

我怎么错过?

回答

0

显然,我应该已经采取了Haskell的做法:让CatList不知情的队列细节,并请求类型类这是能够提取任何队列所需类型的元素,我们正在与供应:

object CatenableListFromQueue { 

    sealed trait CatList[+Q[_], +E] 

    object Empty extends CatList[Nothing, Nothing] 

    case class C[Q[_], E](x: E, q: Q) extends CatList[Q, E] 
} 

class CatenableListFromQueue[E, Q](implicit q: Queue[CatList[Q, E], Q]) extends CatenableList[E] { 

    type CL = CatList[Q, E] 
相关问题