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
我怎么错过?